Защита доступа к GUI (основной поток VCL) из потока с critical secion
- неправильный способ справиться с этим.
Поскольку VCL не доступен напрямую из других потоков, поток должен синхронизировать вызов к VCL.
пример (если ваша версия Delphi поддерживает anonymous methods
):
Synchronize(
procedure
begin
frImage.Load(bmBitmap);
end);
Метод Synchronize
будет заменен на основной поток во время выполнения.
Если у вас более старая версия Delphi, добавьте метод в ваш класс TThread
и вызовите Load оттуда:
TThread.CallLoad;
begin
frImage.Load(bmBitmap);
end;
TThread.Execute;
begin
...
Synchronize( Self.CallLoad);
...
end;
Использование critical section
заключается в сериализации доступа двух (или более) потоков к общему объекту / переменной и т. Д. Но в этом случае обращения к ресурсам VCL из потока строго запрещены.