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

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

thread.terminate [D7, WinXP]


breeze ©   (2006-11-16 20:42:00) 

procedure TForm1.Button10Click(Sender: TObject);
begin
 if Thread1 = nil then
 begin
   button10.Caption := 'Стоп';
   Thread1 := TScanThread.Create(False, edit4.Text, checkbox11.Checked);
 end
 else
 begin
   button10.Caption := 'Старт';
   //Thread1.Terminate;
   TerminateThread(thread1.ThreadID,0);
   Thread1 := nil;
   end;

end;

поток инициализирован как nil
По нажатию на кнопку запускается поток
по повторному нажатию на кнопку по идее он дролжен завершиться, но этого не происходит.
Я походу туплю, но подскажите что неправильно делаю


Суслик   (2006-11-16 21:57:00) [1]


> Eraser ©   (16.11.06 21:03) [4]


> если нужно, чтобы операция выполнилась синхронно, можно
> добавить
> Thread1.WaitFor;

тут еще тонкий момент - а если у его потока стоит FreeOnTerminate?
AccessViolation может быть?

2Автор - у тебя каково значение свойства FreeOnTerminate у потока?


Eraser   (2006-11-16 21:03:00) [2]

> [0] breeze   (16.11.06 20:42)


> TerminateThread(thread1.ThreadID,0);

так потоки завершать очень не рекомендуется. поток должен завершиться сам, т.е.
Thread1.Terminate;
если нужно, чтобы операция выполнилась синхронно, можно добавить
Thread1.WaitFor;


Джо   (2006-11-16 21:02:00) [3]

Используй Thread1.Terminate. Этот метод выставляет свойство Terminated в True. Его тебе и нужно анализировать в теле своего метода Execute и делать выход из него, кода Terminated = True. Вот и всё.
А, да. Поставь еще Thread1.FreeOnTerminate := True.


Джо   (2006-11-16 21:01:00) [4]

Не стоит использовать TerminateThread без очень БОЛЬШОЙ на то нужды. Об этом даже в MSDN написано недвусмысленно.


breeze   (2006-11-16 20:59:00) [5]

h := OpenThread($1,false,Thread1.ThreadID);
     TerminateThread(h,0);
     CloseHandle(h);

изменил вот так, теперь поток останавливается, но не освобождает ресурсы которые использовал. Можно ли его уничтожить подчистую, чтоб от него вообще следа не осталось?


Наверх

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