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

Вниз

Беда с завершением работы потока   Найти похожие ветки 

 
h010d ©   (2005-03-08 15:23) [0]

Допустим есть форма с кнопками "Start" и "Stop", по нажатию "Start" запускается выполнение длительной операции в отдельном потоке, соответственно по нажатию "Stop" поток завершается. При закрытии формы, если поток выполняется, то надо бы его завершить, однако код типа

void __fastcall TfmPlan::FormClose(TObject *Sender, TCloseAction &Action)
{
 if ( FThrd && !FThrd->Terminated )
 {
   FThrd->OnTerminate = NULL;
   FThrd->WaitFor();  
 }
}

приводит к OSError


 
Новичек ©   (2005-03-08 15:34) [1]

Странный код... Надо бы вызвать, по-моему, FThrd->Terminate для завершения потока, а уж потом FThrd->OnTerminate = NULL. Хотя, может, я и ошибаюсь.


 
DiamondShark ©   (2005-03-08 15:40) [2]


> приводит к OSError

Сообщение и код ошибки. Где?


 
GanibalLector ©   (2005-03-08 15:44) [3]

>Беда с завершением работы потока [D6, WinXP]
Ну и где тут D6 ?


 
h010d ©   (2005-03-08 15:46) [4]

>Новичек
 FThrd->Terminate забыл указать

>Сообщение и код ошибки

... raised exception class EOSError with message "System Error.  Code: 6.
Неверный дескриптор".

где вылетает не понятно


 
Новичек ©   (2005-03-08 15:46) [5]

Надо полагать, CBuilder6. Ошибся программер, разгадывая очередную загадку.


 
h010d ©   (2005-03-08 15:47) [6]

>GanibalLector
Очень ценное замечание


 
Новичек ©   (2005-03-08 15:48) [7]

Думаю, для начала следует убрать FThrd->WaitFor(), ждать-то ничего теперь не надо, система сама разберётся, что к чему.


 
h010d ©   (2005-03-08 15:51) [8]

>Новичек
Беда в том что на самом деле код потока юзает свойства формы,  если форма умрет а поток останется, то посыпятся Access violation"ы


 
Новичек ©   (2005-03-08 15:54) [9]

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


 
Новичек ©   (2005-03-08 15:55) [10]

То есть собственником :-)


 
h010d ©   (2005-03-08 15:56) [11]

>Новичек
У потока нет ни родителя ни владельца


 
Новичек ©   (2005-03-08 15:57) [12]

А если так:
while not FThrd.Terminated do Application.ProcessMessages;?
Ну, понятное дело, переведи на C++.


 
Новичек ©   (2005-03-08 16:01) [13]


> У потока нет ни родителя ни владельца
А назначить? Или это на API?


 
Набережных С. ©   (2005-03-08 16:17) [14]

FThrd->Terminated говорит лишь о том, что был произведе вызов метода Terminate, и никак не связан с текущим состоянием потока. Судя по ошибке, поток к моменту вызова WaitFor уже завершился. Так что ошибка у тебя где-то в другом месте.


 
Defunct ©   (2005-03-08 22:00) [15]

h010d ©   (08.03.05 15:23)  

Как вариант:

void __fastcall TfmPlan::TryToClose(TObject *Sender)
{
 PostMessage( Handle, WM_CLOSE, 0, 0);
}

void __fastcall TfmPlan::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( FThrd && !FThrd->Terminated )
   {
      FThed->Terminate;
      FThrd->OnTerminate = TryToClose;
      Action = caNone;
    }
else
    { Action = caFree;}
}



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

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

Наверх




Память: 0.5 MB
Время: 0.029 c
1-1110366264
Dyusha
2005-03-09 14:04
2005.03.20
Одна и та же процедура каждые 5 минут


14-1109655233
КаПиБаРа
2005-03-01 08:33
2005.03.20
Инженерный калькулятор для сотового


14-1109866422
kaif
2005-03-03 19:13
2005.03.20
Вопрос[2]. О власти


3-1108621131
Sour
2005-02-17 09:18
2005.03.20
Можно ли в условии запроса использовать хранимую процедуру


1-1110201679
WebPauk
2005-03-07 16:21
2005.03.20
отрисовка