Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно закрыть все потоки закрывая программу? [D7, WinXP]


Страницы:   1 2

Gear ©   (2006-11-03 10:38:00) 

Из главного потока создаю несколько, которые занимаются закачкой из сети.
Нужно чтобы при закрытии основной программы, сначала закончились все потоки, и только затем завершался главный поток программы.
Делаю так:
1) В потоках делаю что-то типа
While not Terminated do begin
end;
2) Держу ThreadList и имею функцию что-то типа:

procedure TForm1.Term;
var
 i:integer;
begin
  with ThreadList, LockList do
   try
      for i := 0 to Count - 1 do
      begin
         TThr(Items[i]).Terminate;
      end;
   finally
     UnlockList
   end;
end;

Такую функцию вешаю на кнопку и жду завершения потоков. Но что-то всё это не работает.
Подскажие пож-та как решить правильно мою задачу?


Дмитрий Белькевич   (2006-11-03 13:18:00) [21]

>Программа виснет. Видимо в цикле

Так посмотри, там или нет - бряк не долго поставить.
Если там, то собсно у тебя Terminate не проходит в каком-то или во всех потоках, соответственно, Count всегда больше нуля.


Gear   (2006-11-03 13:03:00) [22]

Программа виснет. Видимо в цикле
while True do
with ThreadList.LockList do
try
   if Count = 0 then Break;
finally
  UnlockList
end;

sleep(1000) не помогает


Gear   (2006-11-03 12:59:00) [23]

хорошо, а это всё вешать на OnClose?


Сергей М.   (2006-11-03 12:33:00) [24]

Вот именно туда куда я написал, т.е. непосредственно следом за

with ThreadList.LockList do
 try
    for i := 0 to Count - 1 do
       TThr(Items[i]).Terminate;
 finally
   UnlockList
 end;


Gear   (2006-11-03 12:07:00) [25]

вот до этого места

while True do
 with ThreadList.LockList do
 try
    if Count = 0 then Break;
 finally
   UnlockList
 end;

у меня всё так.

Куда вот это?


Сергей М.   (2006-11-03 11:48:00) [26]

constructor TThr.Create(uri:TStringList);
begin
inherited Create(True);
...
Form1.ThreadList.Add(Self);
...
end;

destructor TThr.Destroy; //override !
begin
..
 inherited;
 Form1.ThreadList.Remove(Self);
..  
end;

...

with ThreadList.LockList do
  try
     for i := 0 to Count - 1 do
        TThr(Items[i]).Terminate;
  finally
    UnlockList
  end;

while True do
  with ThreadList.LockList do
  try
     if Count = 0 then Break;
  finally
    UnlockList
  end;


Gear   (2006-11-03 11:34:00) [27]

constructor TThr.Create(uri:TStringList);
begin
inherited Create(True);
Form1.ThreadList.Add(Self);
Furi:=Tstringlist.Create;
Furi.AddStrings(rssuri);
FreeOnTerminate:=True;
resume;
end;


Сергей М.   (2006-11-03 11:30:00) [28]

Чему равно св-во FreeOnTerminate ?


Gear   (2006-11-03 11:29:00) [29]

не более 5-10


Сергей М.   (2006-11-03 11:26:00) [30]

Ну плохо что от балды)

Какое макс.число потоков может существовать у тебя ?


Gear   (2006-11-03 11:24:00) [31]

От балды, увидел пример и всё.


Сергей М.   (2006-11-03 11:17:00) [32]

Ну а почему, скажем, не TList и не TObjectList ?
Ведь какими-то соображениями ты, наверно, руководствовался, выбирая именно этот класс для управления списком ? Или от балды выбрал его ?)


Gear   (2006-11-03 11:14:00) [33]

Только чтобы их прибить. Других способов я незнаю.


Сергей М.   (2006-11-03 11:12:00) [34]

А с какой целью ты используешь TThreadList ?


Gear   (2006-11-03 11:11:00) [35]

Есть пример как надо? И в какую сторону копать?


Сергей М.   (2006-11-03 11:08:00) [36]


> как сделать это при закрытии программы?


Например, используя ExitProcessProc


> Как узнать убились ли все потоки


Это зависит от того как ты реализовал свой TThr


Ketmar   (2006-11-03 11:02:00) [37]

у-у-у... повесь лучше какого-нибудь негра. процедуру-то за что вешать?


Gear   (2006-11-03 11:01:00) [38]

Если повесить на кнопку процедуру Term то всё работает. Но как сделать это при закрытии программы? Как узнать убились ли все потоки, а потом только разрешить закрыться программе?


Сергей М.   (2006-11-03 10:41:00) [39]


> что-то всё это не работает.


Что значит "не работает" ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо