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

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

Проблема с потоками [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 есть пример.


Наверх

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