Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1107445405
Lucifer
2005-02-03 18:43
2005.03.20
Как отследить какие пользователь нажал кнопки на клаве?


1-1109764611
All
2005-03-02 14:56
2005.03.20
Delphi и Dll от FoxPro


4-1107533019
andrewman
2005-02-04 19:03
2005.03.20
Как сделать соединение двух компов через модем?


1-1109925653
antoxa
2005-03-04 11:40
2005.03.20
Подскажите, как работать с TClientDataSet?


1-1109918516
leonidus
2005-03-04 09:41
2005.03.20
Access violation at addres - случаи возникновения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский