![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно закрыть все потоки закрывая программу? [D7, WinXP]
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]
> что-то всё это не работает.
Что значит "не работает" ?