请教,C++ Builder 提示“system error,code:1400,无效的窗口句柄”如何解决??

时间:2022-01-18 18:40:39
    各位高手,请教一下,现在程序中添加一个线程,用来采集数据和更新数据库,更新Image,线程结束后,点击Button3执行Form3->Show();就会弹出“system error,code:1400,无效的窗口句柄”,但如果在执行结束前,点击过Button3执行Form3->Show();就不会出错,请问各位是什么问题呀?谢谢!

代码如下:
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


引用 1 楼 songhtao 的回复:
线程结束后,可能释放了某些资源。造成问题


设置的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对象
}

#6


确实是释放线程影响了Form3,能不能跟踪或者借用codeguard工具试试

#7


找到问题的原因了,是线程中VCL同步的问题,哎,线程真是不太好理解呀.
十分很感谢songhtao和c0c0cf和ksrsoft。

#1


线程结束后,可能释放了某些资源。造成问题

#2


该线程结束的时候,内核对象计数减为零所以句柄指向的内核对象不存在,句柄就无效了。

#3


引用 1 楼 songhtao 的回复:
线程结束后,可能释放了某些资源。造成问题


设置的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对象
}

#6


确实是释放线程影响了Form3,能不能跟踪或者借用codeguard工具试试

#7


找到问题的原因了,是线程中VCL同步的问题,哎,线程真是不太好理解呀.
十分很感谢songhtao和c0c0cf和ksrsoft。