Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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(который срабатывает при завершении работы потока), получается что объекты которые были созданы при работе потока не разрушаются.

Знающие люди, подскажите что я делаю не так, в какую сторону копать как новичку?
Ответить с цитированием
  #2  
Старый 25.01.2013, 11:42
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Никогда не пользовался сторонними библиотеками для работы с потоками.
Обычно завершаю поток таким образом:
Код:
  FThread.Terminate; //установили потоку флажок говорящий о том что неплохо бы завершиться
  FThread.WaitFor;  //подождали пока поток закончит все свои действия
  FThread.Free;  //вызвали деструктор потока
естественно, что в коде потока нужно переодически проверять значение свойств Terminated.

И всегда работало на ура, я даже не знал о существовании каких-либо библиотек для работы с потоками, потому что нужды не было в этом.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 31.01.2013, 07:45
Аватар для TolAlik
TolAlik TolAlik вне форума
Прохожий
 
Регистрация: 02.10.2009
Сообщения: 41
Репутация: 10
По умолчанию

Ну, вот есть такая библиотека. И тут немного по другому делается.
Сначала думал, что я неправильно останавливаю тело потока, что из-за него Task.Terminate висит, ожидая завершения действий в потоке.
Но тут что-то другое...
И фиг знает, что не так...
Ответить с цитированием
  #4  
Старый 31.01.2013, 09:05
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

сделай по-человечески через TThread и тебе будет проще помочь
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter