Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.05;
Скачать: CL | DM;

Вниз

Проблема с потоками   Найти похожие ветки 

 
grigor   (2011-02-25 17:36) [0]

Создаю поток:
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;


 
RWolf ©   (2011-02-25 17:43) [1]

в каталоге Demos\Threads есть пример.


 
Amoeba_   (2011-02-25 20:35) [2]


> Помогите, с потоками первый день работаю.

Пожалуйста!
Читать до полного просветления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1370


 
grigor   (2011-02-25 20:38) [3]

Нашел такую вещь: после этого кода при повторном обращении к 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;


 
grigor   (2011-02-25 20:52) [4]

Всмысле вылетает не из программы, а из функции - т.е. при следующей проверке кол-ва записей дальше код в потоке не идет.


 
Palladin ©   (2011-02-25 22:01) [5]

как бы ты перевел LockList ?


 
grigor   (2011-02-25 22:11) [6]

2Palladin
???
Кажется я понял намек, теперь работает, но всеравно не понимаю почему так.
 for i := 0 to getThreadCount - 1 do
 begin
   TParserThread(ThreadList.LockList.Items[i]).Terminate;
   ThreadList.UnlockList;
 end;


 
Palladin ©   (2011-02-25 22:12) [7]

да потому что ты хреново намек понял, а справку вообще не читал


 
Palladin ©   (2011-02-25 22:14) [8]

а класс TThreadList вообще не предназначен для хранения объектов потоков


 
RWolf ©   (2011-02-26 01:00) [9]


> теперь работает, но всеравно не понимаю почему так.

чего ж непонятного — сколько раз в [3] вызывается LockList?
правильно, один раз при взятии значения Count, и ещё Count раз в цикле.
а UnlockList — всего единожды.
дальше второго подряд вызова LockList управление не пройдёт.


 
Slym ©   (2011-02-26 11:25) [10]

лишнюю переменную зажали?
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;



Страницы: 1 вся ветка

Текущий архив: 2011.06.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
2-1296858499
Alik
2011-02-05 01:28
2011.06.05
Сбой при вызове методов ZLib из DLL


2-1298528519
Trekker
2011-02-24 09:21
2011.06.05
Открытие страницы IE в полноэкранном режиме в текущем окне


2-1298303360
Alex_C
2011-02-21 18:49
2011.06.05
Ошибка при FreeLibrary


2-1298280359
>|<
2011-02-21 12:25
2011.06.05
как проверить, что файл открыт


2-1298442017
snl73
2011-02-23 09:20
2011.06.05
Градиентная представление массива данных