Остановка TThread
Я делаю так :
void __fastcall TForm1::StopSearch()
{
thread1->Terminate();
thread1->WaitFor();
delete thread1;
}
В Execute самого потока пишу
void __fastcall TSearchThread::Execute()
{
...
while(...)
{
if(Terminated)
return;
...
}
}
При попытке остановить поток Билдер выкидывает Exeption : System Error code 6 :Неверный дескриптор. Чего не так?
void __fastcall TForm1::StopSearch()
{
thread1->Terminate();
delete thread1;
}
В Execute самого потока пишу
void __fastcall TSearchThread::Execute()
{
do
{
....
}
while(!Terminated);
}
delete thread1;
Если убрать, все нормально. Так ведь не уберешь.
Где у тебя объявлена эта переменная и где ты ее инициализируешь
Вот смотри
do
{
func1();
}
while(!Terminated);
когда ты пишешь
thread1->Terminate();
Это означает что как только поток выдет из
func1() цикл завершиться и поток остановиться, значит после терминирования необходимо дождаться завершения этой функции а потом удалять объект потока.
Цитата:
Originally posted by SEDEGOFF
Я разобрался чет почем
Вот смотри
do
{
func1();
}
while(!Terminated);
когда ты пишешь
thread1->Terminate();
Это означает что как только поток выдет из
func1() цикл завершиться и поток остановиться, значит после терминирования необходимо дождаться завершения этой функции а потом удалять объект потока.
Я разобрался чет почем
Вот смотри
do
{
func1();
}
while(!Terminated);
когда ты пишешь
thread1->Terminate();
Это означает что как только поток выдет из
func1() цикл завершиться и поток остановиться, значит после терминирования необходимо дождаться завершения этой функции а потом удалять объект потока.
Ну так вот для этого я и использую функцию WaitFor (у меня действие в цикле длится 1-2 сек). При этом ошибка (та же самая) выскакивает уже не при удалении объекта, а при выполнении билдеровской строки
/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
из файла Forms.hpp (описание класса TForm)
Это происходит сразу после выхода из Execute.
Фигня какая-то.
thread1 = new TSearchThread (EditIPBeg->Text,EditIPEnd->Text);
thread1->OnTerminate = ThreadDone;
Ну тут тоже делаеться попытка удалить работающий поток.
У себя я сделал следующее
1. В функции которая работает пототок поставил проверку
if(Terminated)
break;
2.Удаление сделал так
try
{
Sleep(60);
delete prog;
}
catch(...)
{
Sleep(60);
delete prog;
}
Оно работает! Огромное спасибо!