Всем привет!
Столкнулся с проблемой при работе с потоками. Когда во время работающего потока, вызываю Terminate.
Для работы с потоками использую библиотеку OmniThreadLibrary (это библиотека для создания многопоточных приложений в Delphi).
создаю класс как наследник от TOmniWorker
Код:
TTask = class(TOmniWorker)
public
function Initialize: boolean; override; //здесь инициализирую нужные для работы потока объекты и переменные
procedure Cleanup; override; //здесь их разрушаю
procedure CountInt; //тут выполняю всякие действия
end;
В событии OnCreate у формы создаю поток
Код:
uses
OtlThreadPool, OtlTaskControl, OtlEventMonitor, OtlCommon, OtlComm, OtlTask
...
pablic
Task : IOmniTaskControl;
...
Task:=CreateTask(TTask.Create(),'Task ')); //создаю поток
Task.Run;//запускаю его
Task.Invoke(@TTask.CountInt, []);//выполняю метод CountInt
В событии OnDestroy у формы завершаю работу потока
Код:
if Task <> nil then
begin
Task.Terminate; //завершаем
Task:=nil;
end;
Если закрыть приложение в то время как поток делает какие-то действия, то на этом намертво повисает GUI оболочка приложения, которая ждет пока Terminate получит ответа от потока (хотя в примере от библиотеки все работает замечательно). Или наоборот указать
тогда поток завершиться точно через указанный промежуток времени, но не выполнят метод Cleanup(который срабатывает при завершении работы потока), получается что объекты которые были созданы при работе потока не разрушаются.
Знающие люди, подскажите что я делаю не так, в какую сторону копать как новичку?