Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
ВнизБеда с завершением работы потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.046 c