Если взять пример “Рисование мышью в графическом окне” и добавить в него отрисовку в бесконечном цикле (например для анимации), то после некоторого активного рисования мышкой программа упадёт.
Предполагаю, что это связано с тем, что обработчики событий мыши и клавиш вызываются во втором потоке и мешают основному потоку. Но если оно обнаруживает блокировку, то получается там есть какой-то мьютекс, а падающий участок кода рассчитан на многопоточность и просто не хочет ждать?
Извиняюсь, если говорю глупости. Совсем не знаю как внутри устроены PascalABC .NET и .NET Framework. Я что-то делаю не так? Надо использовать синхронизацию через lock или ещё что-то?
Мне кажется хорошо было бы отказаться от обработчиков во втором потоке. Лучше бы программа узнавала бы о событиях через вызов какого-нибудь GetInputEvents(): array of InputEvent.
uses GraphABC;
procedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
if mb=1 then LineTo(x,y);
end;
begin
// Привязка обработчиков к событиям
OnMouseDown := MouseDown;
OnMouseMove := MouseMove;
while (true) do
begin
Circle(100,100,50);
end;
end.
Upd: Чтобы тема лучше гуглилась, добавлю ошибку текстом.
Ошибка времени выполнения: System.InvalidOperationException: В данный момент объект используется другим процессом.
Стек:
в System.Drawing.Pen.get_DashStyle()
в GraphABC.GraphABC.Ellipse(Int32 x1, Int32 y1, Int32 x2, Int32 y2)
в GraphABC.GraphABC.Circle(Int32 x, Int32 y, Int32 r)
в падает.Program.$Main() в C:\PABCWork.NET\падает.pas:строка 21
в падает.Program.Main()