![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Беда с завершением работы потока [D6, WinXP]
h010d © (2005-03-08 15:23:00)Допустим есть форма с кнопками "Start" и "Stop", по нажатию "Start" запускается выполнение длительной операции в отдельном потоке, соответственно по нажатию "Stop" поток завершается. При закрытии формы, если поток выполняется, то надо бы его завершить, однако код типа
void __fastcall TfmPlan::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( FThrd && !FThrd->Terminated )
{
FThrd->OnTerminate = NULL;
FThrd->WaitFor();
}
}
приводит к OSError
Defunct (2005-03-08 22:00:00) [1]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;}
}
Набережных С. (2005-03-08 16:17:00) [2]FThrd->Terminated говорит лишь о том, что был произведе вызов метода Terminate, и никак не связан с текущим состоянием потока. Судя по ошибке, поток к моменту вызова WaitFor уже завершился. Так что ошибка у тебя где-то в другом месте.
Новичек (2005-03-08 16:01:00) [3]
> У потока нет ни родителя ни владельца
А назначить? Или это на API?
Новичек (2005-03-08 15:57:00) [4]А если так:
while not FThrd.Terminated do Application.ProcessMessages;?
Ну, понятное дело, переведи на C++.
h010d (2005-03-08 15:56:00) [5]>Новичек
У потока нет ни родителя ни владельца
Новичек (2005-03-08 15:55:00) [6]То есть собственником :-)
Новичек (2005-03-08 15:54:00) [7]Можно назначить родителем потока форму, т.е. при уничтожении формы поток уничтожится автоматом. Сейчас запущу CBuilder, попробую...
h010d (2005-03-08 15:51:00) [8]>Новичек
Беда в том что на самом деле код потока юзает свойства формы, если форма умрет а поток останется, то посыпятся Access violation'ы
Новичек (2005-03-08 15:48:00) [9]Думаю, для начала следует убрать FThrd->WaitFor(), ждать-то ничего теперь не надо, система сама разберётся, что к чему.
h010d (2005-03-08 15:47:00) [10]>GanibalLector
Очень ценное замечание
h010d (2005-03-08 15:46:00) [11]>Новичек
FThrd->Terminate забыл указать
>Сообщение и код ошибки
... raised exception class EOSError with message 'System Error. Code: 6.
Неверный дескриптор'.
где вылетает не понятно
Новичек (2005-03-08 15:46:00) [12]Надо полагать, CBuilder6. Ошибся программер, разгадывая очередную загадку.
GanibalLector (2005-03-08 15:44:00) [13]>Беда с завершением работы потока [ D6, WinXP]
Ну и где тут D6 ?
DiamondShark (2005-03-08 15:40:00) [14]
> приводит к OSError
Сообщение и код ошибки. Где?
Новичек (2005-03-08 15:34:00) [15]Странный код... Надо бы вызвать, по-моему, FThrd->Terminate для завершения потока, а уж потом FThrd->OnTerminate = NULL. Хотя, может, я и ошибаюсь.