Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2015, 08:29   #1
grb
 
Регистрация: 20.10.2014
Сообщений: 2
По умолчанию Массив потоков. Не приходит Terminate

Добрый день. Создаю массив потоков. И, иногда, несколько потоков из этого массива не могут завершиться. (Terminate=false). Почему?
Код:
TDBPacket = class(TThread)
arDB: array of TDBPacket;

//создание массива потоков 
   SetLength(arDB, dbThreadCnt);
   for i :=0  to dbThreadCnt-1 do
   begin
     StartDBThreadNew(arDB[i], i+1);
   end;


//создание потока
procedure StartDBThreadNew(var s:TDBPacket;Anum: integer);
begin
    s:=TDBPacket.Create(true);
    s.FreeOnTerminate:=false;
    s. Priority:=tpHigher;
    s. resume;
   end;

//удаление потоков
for j := 0 to dbThreadCnt-1 do
  StopDBThreadNew(arDB[j] , j);

//процедура удаления потока
procedure StopDBThreadNew(S: TDBPacket; num: integer);
begin
with S do
begin
  Terminate;
  WaitFor;
  Free;
end;
   
end;

Последний раз редактировалось Stilet; 26.01.2015 в 09:51.
grb вне форума Ответить с цитированием
Старый 26.01.2015, 10:00   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
И, иногда, несколько потоков из этого массива не могут завершиться. (Terminate=false). Почему?
terminate это не завершение потока, а установка внутреннего флага объекта-потока (переменной terminated).
Данный флаг (переменная) может и должен быть проверяем внутри процедуры Execute для выполнения действий по завершению потока (обычно это остановка цикла).
Код:
while not terminated do begin
  .....0
end;
Код:
while true do begin
... 
if terminated then Break;
....
end;
P.S. и совсем не обязательно ждать завершения потока для инициализации остановки другого.
лучше использовать событие onTerminate
s.OnTreminate:=MyStopEventThread;

Код:
procedure TFrom1.MyStopEventThread(sender:TObject);
begin
  for j:=0 to length(ardb)-1 do
     if ardb[i]=sender as tthread then FreeandNIL(ardb[i]);
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.01.2015 в 10:03.
evg_m вне форума Ответить с цитированием
Старый 26.01.2015, 10:03   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что в потоке самом делается?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.01.2015, 10:15   #4
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Цитата:
Сообщение от grb Посмотреть сообщение
И, иногда, несколько потоков из этого массива не могут завершиться. (Terminate=false). Почему?
Например потому, что в потоке возникает исключение, которое не обрабатывается. В результате поток зависает (продолжает работать, и не уничтожается).
WinCoder вне форума Ответить с цитированием
Старый 26.01.2015, 10:19   #5
grb
 
Регистрация: 20.10.2014
Сообщений: 2
По умолчанию

конечно terminated.
а когда делаешь
Код:
with S do
begin
  Terminate;
  WaitFor;
  Free;
end;
разве ошибки не будет при FreeandNIL(ardb[i]:?

исключения могут быть, но все обернуто в try-except. так что по-любому вернемся в execute и проверим terminated. дело в том, что проект реализован в виде службы (24/7). два дня работает и падает, или 3 часа работает и падает.

поэтому грешу на саму организацию создания и завершения потоков

Последний раз редактировалось Stilet; 26.01.2015 в 10:47.
grb вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многократное использование потоков(пул потоков) ProgrammistRT Общие вопросы Delphi 10 06.04.2014 13:42
Массив потоков, и как они очищаются Winexcel Общие вопросы Delphi 5 09.10.2013 16:43
Не дать накапливаться N кол-ву потоков в критической секции. Массив. HSR Общие вопросы Delphi 7 15.11.2012 01:02
У N одновременно запущенных потоков приходит N события с одними и теми же параметрами TwiX Работа с сетью в Delphi 3 20.02.2010 21:17
Application.terminate GAGARIN-NEW Общие вопросы Delphi 11 09.03.2008 19:32