Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Остановка TThread

1.1K
17 ноября 2003 года
teran
73 / / 15.04.2003
Не подскажете как правильно выполнение потока остановить.
Я делаю так :

void __fastcall TForm1::StopSearch()
{
thread1->Terminate();
thread1->WaitFor();
delete thread1;
}

В Execute самого потока пишу

void __fastcall TSearchThread::Execute()
{
...
while(...)
{
if(Terminated)
return;
...
}
}

При попытке остановить поток Билдер выкидывает Exeption : System Error code 6 :Неверный дескриптор. Чего не так?
293
18 ноября 2003 года
SEDEGOFF
586 / / 06.10.2002
Я делаю так :

void __fastcall TForm1::StopSearch()
{
thread1->Terminate();
delete thread1;
}

В Execute самого потока пишу

void __fastcall TSearchThread::Execute()
{
do
{
....
}
while(!Terminated);
}
1.1K
18 ноября 2003 года
teran
73 / / 15.04.2003
Пробовал и так, и этак - выдает ошибку на
delete thread1;
Если убрать, все нормально. Так ведь не уберешь.
293
18 ноября 2003 года
SEDEGOFF
586 / / 06.10.2002
Где у тебя объявлена эта переменная и где ты ее инициализируешь
293
18 ноября 2003 года
SEDEGOFF
586 / / 06.10.2002
Я разобрался чет почем
Вот смотри
do
{
func1();
}
while(!Terminated);
когда ты пишешь
thread1->Terminate();
Это означает что как только поток выдет из
func1() цикл завершиться и поток остановиться, значит после терминирования необходимо дождаться завершения этой функции а потом удалять объект потока.
1.1K
18 ноября 2003 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by SEDEGOFF
Я разобрался чет почем
Вот смотри
do
{
func1();
}
while(!Terminated);
когда ты пишешь
thread1->Terminate();
Это означает что как только поток выдет из
func1() цикл завершиться и поток остановиться, значит после терминирования необходимо дождаться завершения этой функции а потом удалять объект потока.



Ну так вот для этого я и использую функцию WaitFor (у меня действие в цикле длится 1-2 сек). При этом ошибка (та же самая) выскакивает уже не при удалении объекта, а при выполнении билдеровской строки
/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
из файла Forms.hpp (описание класса TForm)
Это происходит сразу после выхода из Execute.
Фигня какая-то.

1.1K
18 ноября 2003 года
teran
73 / / 15.04.2003
А насчет переменной - указатель описан в TForm1 (public), а инициализирую я ее следующим образом :

thread1 = new TSearchThread (EditIPBeg->Text,EditIPEnd->Text);
thread1->OnTerminate = ThreadDone;
293
19 ноября 2003 года
SEDEGOFF
586 / / 06.10.2002
virtual ~TForm(void) { }
Ну тут тоже делаеться попытка удалить работающий поток.

У себя я сделал следующее
1. В функции которая работает пототок поставил проверку
if(Terminated)
break;
2.Удаление сделал так
try
{
Sleep(60);
delete prog;
}
catch(...)
{
Sleep(60);
delete prog;
}
1.1K
19 ноября 2003 года
teran
73 / / 15.04.2003
Оно работает! Огромное спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог