Потоки ( C++ Builder )

Статус
В этой теме нельзя размещать новые ответы.

head

Гость города
#1
Подскажите, в чем проблема:
создаю 4-х поточное приложение,
все прекрасно,
один из потоков всегда крутится с приоритетом RealTime,
при завершении работы корректно уничтожаю все,
НО
иногда Win9x - выскакивает в синий экран без серьезных последствий, WinNT - всегда без сбоев.
--------
В чем секрет?
 
G

Guest

Guest
#2
Привет, Олег.
А насколько корректно ты их уничтожаешь ?
Это может быть из-за того что первичный (главный) поток твоего приложения завершается раньше других.
В 9х это иногда проходит нормаьлно, а иногда с синим экраном.

Было бы неплохо, посмотреть на код.
 

head

Гость города
#3
to qwerty

привожу код:
//--------------------------------------
class TController : public TComponent
{
friend TCOMportIO;
private:
TCOMportIO *FCOMportIO; // point to class
TNotifyEvent FOnDoneRead;
TNotifyEvent FOnDoneWrite;
.....
}

//-----------------------------------------

class TCOMportIO : public TThread
{
public:
bool isActive;
TController *OwnerController;
virtual __fastcall TCOMportIO(bool E):TThread( E ){};
virtual void __fastcall Execute();
};

//------------------------------------------------

__fastcall TController::~TController()
{
FEnableProcess=false;
UpdataController();
FCOMportIO->FreeOnTerminate=true;
if( FCOMportIO->Suspended )FCOMportIO->Resume();
FCOMportIO->Terminate();
}
//----------------

void __fastcall TController::UpdataController( void )
{
if( ! FCOMportIO->Suspended )FCOMportIO->Suspend();
if( isReady && Hfile )
{
if( FOnDoneRead && FEnableProcess )
{
FCOMportIO->isActive=true;
if( FCOMportIO->Suspended )FCOMportIO->Resume();
}
}else FCOMportIO->isActive=false;
}

//---------------------

void __fastcall TCOMportIO::Execute()
{
do{
if( isActive )
{
Priority=tpTimeCritical;
SleepEx( 15, false );
....
Synchronize( OwnerController->DoneWrite );
Synchronize( OwnerController->DoneRead );
}

else
{
Priority=tpNormal;
SleepEx( 100, false );
}
}while( !Terminated );
}

------------------------------------------
в целом - это мой невизуальный компонент для работы с COM-портами.
 
G

Guest

Guest
#4
__fastcall TController::~TController()
{
FEnableProcess=false;
UpdataController();
FCOMportIO->FreeOnTerminate=true;
if( FCOMportIO->Suspended )FCOMportIO->Resume();
FCOMportIO->Terminate();
// попробуй добавить
WaitForSingleObject(FCOMportIO->Handle(), NFINITE);
}

А как, кстати, у тебя создаются и удаляются TCOMportIO ?
 

head

Гость города
#5
to qwerty

__fastcall TController::TController(TComponent* Owner)
: TComponent(Owner),
FEnableProcess( false ),
...
{
Hfile=NULL;
isOpened=false;
isReady=false;
FCOMportIO = new TCOMportIO( true );
FCOMportIO->OwnerController=this;
FCOMportIO->isActive=false;
}

//----------------------------

***похоже в деструкторе надо бы добавить

delete FCOMportIO; //--
 
Статус
В этой теме нельзя размещать новые ответы.