代码如下:
void __fastcall TForm_Main::Button3(TObject *Sender)
{
Form3->Show();
}
__fastcall TRecordThread::TRecordThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
//定义线程优先级
Priority=tpHigher;
FreeOnTerminate=false;
}
//自定义线程函数——TRecordThread
void __fastcall TRecordThread::Execute()
{
cs->Acquire();
while(Terminated==false)
{
//采集数据
……
//更新数据库
this->Synchronize(Record_Update);
//更新显示Image
this->Synchronize(Image_Update);
if(finished)
break;
}//while(Terminated==false)
cs->Release();
}
//自定义线程函数——TRecordThread
void __fastcall TRecordThread::Image_Update()
{
//更新Image
……
}
//自定义线程函数——TRecordThread
void __fastcall TRecordThread::Record_Update()
{
//用AdoQuery Insert into更新Record
……
}
7 个解决方案
#1
线程结束后,可能释放了某些资源。造成问题
#2
该线程结束的时候,内核对象计数减为零所以句柄指向的内核对象不存在,句柄就无效了。
#3
设置的FreeOnTerminate=false呀?
#4
还是解决不了,各位给点意见啦,谢谢!
#5
另外,点击“退出”按钮执行退出后,执行完Form3 OnDestroy,再执行到/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { },也出现同样的提示:
void __fastcall TForm_Main::Button_QuiteClick(TObject *Sender)
{
if(My_RecordThread)
{
My_RecordThread->Terminate();
My_RecordThread->Free();
My_RecordThread =NULL;
}
ADOConnection1->Close();
Application->Terminate();
}
void __fastcall TForm3::FormDestroy(TObject *Sender)
{
delete MyVCL; //删除TList对象
}
void __fastcall TForm_Main::Button_QuiteClick(TObject *Sender)
{
if(My_RecordThread)
{
My_RecordThread->Terminate();
My_RecordThread->Free();
My_RecordThread =NULL;
}
ADOConnection1->Close();
Application->Terminate();
}
void __fastcall TForm3::FormDestroy(TObject *Sender)
{
delete MyVCL; //删除TList对象
}
#6
确实是释放线程影响了Form3,能不能跟踪或者借用codeguard工具试试
#7
找到问题的原因了,是线程中VCL同步的问题,哎,线程真是不太好理解呀.
十分很感谢songhtao和c0c0cf和ksrsoft。
十分很感谢songhtao和c0c0cf和ksrsoft。
#1
线程结束后,可能释放了某些资源。造成问题
#2
该线程结束的时候,内核对象计数减为零所以句柄指向的内核对象不存在,句柄就无效了。
#3
设置的FreeOnTerminate=false呀?
#4
还是解决不了,各位给点意见啦,谢谢!
#5
另外,点击“退出”按钮执行退出后,执行完Form3 OnDestroy,再执行到/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { },也出现同样的提示:
void __fastcall TForm_Main::Button_QuiteClick(TObject *Sender)
{
if(My_RecordThread)
{
My_RecordThread->Terminate();
My_RecordThread->Free();
My_RecordThread =NULL;
}
ADOConnection1->Close();
Application->Terminate();
}
void __fastcall TForm3::FormDestroy(TObject *Sender)
{
delete MyVCL; //删除TList对象
}
void __fastcall TForm_Main::Button_QuiteClick(TObject *Sender)
{
if(My_RecordThread)
{
My_RecordThread->Terminate();
My_RecordThread->Free();
My_RecordThread =NULL;
}
ADOConnection1->Close();
Application->Terminate();
}
void __fastcall TForm3::FormDestroy(TObject *Sender)
{
delete MyVCL; //删除TList对象
}
#6
确实是释放线程影响了Form3,能不能跟踪或者借用codeguard工具试试
#7
找到问题的原因了,是线程中VCL同步的问题,哎,线程真是不太好理解呀.
十分很感谢songhtao和c0c0cf和ksrsoft。
十分很感谢songhtao和c0c0cf和ksrsoft。