Показать сообщение отдельно
  #1  
Старый 25.01.2013, 10:20
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию Не правильно завершаю работу потока

Всем привет!
Столкнулся с проблемой при работе с потоками. Когда во время работающего потока, вызываю 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 получит ответа от потока (хотя в примере от библиотеки все работает замечательно). Или наоборот указать
Код:
Task.Terminate(3000);
тогда поток завершиться точно через указанный промежуток времени, но не выполнят метод Cleanup(который срабатывает при завершении работы потока), получается что объекты которые были созданы при работе потока не разрушаются.

Знающие люди, подскажите что я делаю не так, в какую сторону копать как новичку?
Ответить с цитированием