![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с потоками [D7, XP]
grigor © (2011-02-25 17:36:00)Создаю поток:
FindProcessThread := TFindProcessThread.Create;
Останавливаю поток:
FindProcessThread.Terminate;
Заново создаю, выполняется конструктор:
constructor TFindProcessThread.Create(URLList:TListView; ProxyList:TListView;
MaxThreads:Integer);
begin
self.FreeOnTerminate := True;
inherited Create(false);
end;
И дальше ничего не происходит, главный цикл Execute не работает. Помогите, с потоками первый день работаю.
Деструктор:
constructor Create;
destructor Destroy; override;
procedure Execute; override;
//..
destructor TFindProcessThread.Destroy;
var
i: Integer;
begin
//...
inherited Destroy;
end;
Slym (2011-02-26 11:25:00) [1]лишнюю переменную зажали?
list:=ThreadList.LockList;
try
for i:= 0 to list.Count - 1 do
TParserThread(list.Items[i]).Terminate;
finally
ThreadList.UnlockList;
end;
или без явной переменной
with ThreadList.LockList do;
try
for i:= 0 to Count - 1 do
TParserThread(Items[i]).Terminate;
finally
ThreadList.UnlockList;
end;
RWolf (2011-02-26 01:00:00) [2]
> теперь работает, но всеравно не понимаю почему так.
чего ж непонятного — сколько раз в [3] вызывается LockList?
правильно, один раз при взятии значения Count, и ещё Count раз в цикле.
а UnlockList — всего единожды.
дальше второго подряд вызова LockList управление не пройдёт.
Palladin (2011-02-25 22:14:00) [3]а класс TThreadList вообще не предназначен для хранения объектов потоков
Palladin (2011-02-25 22:12:00) [4]да потому что ты хреново намек понял, а справку вообще не читал
grigor (2011-02-25 22:11:00) [5]2Palladin
???
Кажется я понял намек, теперь работает, но всеравно не понимаю почему так.
for i := 0 to getThreadCount - 1 do
begin
TParserThread(ThreadList.LockList.Items[i]).Terminate;
ThreadList.UnlockList;
end;
Palladin (2011-02-25 22:01:00) [6]как бы ты перевел LockList ?
grigor (2011-02-25 20:52:00) [7]Всмысле вылетает не из программы, а из функции - т.е. при следующей проверке кол-ва записей дальше код в потоке не идет.
grigor (2011-02-25 20:38:00) [8]Нашел такую вещь: после этого кода при повторном обращении к ThreadList.LockList.Count вылетает без каких либо предупреждений.
Добавление в/удаление из ThreadList производится в деструкторе и конструкторе потоков.
var
i: Integer;
begin
for i := 0 to ThreadList.LockList.Count - 1 do
TParserThread(ThreadList.LockList.Items[i]).Terminate;
ThreadList.UnlockList;
inherited Destroy;
end;
Amoeba_ (2011-02-25 20:35:00) [9]
> Помогите, с потоками первый день работаю.
Пожалуйста!
Читать до полного просветления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1370
RWolf (2011-02-25 17:43:00) [10]в каталоге Demos\Threads есть пример.