当 Execute() 在 C++ Builder 中终止时,不会调用 OnTerminate() 方法

OnTerminate() method is not called when Execute() terminates in C++ Builder

本文关键字:OnTerminate 方法 调用 Execute C++ Builder 终止      更新时间:2023-10-16

我正在使用 TThread 来填充 SQL 数据库。当此线程结束时,必须在主窗体上启用某些对象。

我希望此代码位于OnTerminate()事件中。

但是,当 Execute() 方法结束时,不会调用 OnTerminate()

为什么不叫这个?我错过了什么还是忘记了什么?

这是主窗体中的代码:

void __fastcall TAF_Calc_Form::Button_LUClick(TObject *Sender)
{
Button_LU->Enabled = false;
TUrenThread* ut = new TUrenThread(true); 
ut->FreeOnTerminate = true;
ut->Start();
}

这是Execute()代码:

void __fastcall TUrenThread::Execute()
{
    Synchronize(&MoveFirst_AD);
    while (!AF_Calc_Form->PvQ_AfleverD->Eof)
    {
           //code executes here
    };
}

这是OnTerminate()方法:

void __fastcall TUrenThread::OnTerminate()
{
    AF_Calc_Form->Button_LU->Enabled = false;
}
TThread没有

OnTerminate()方法。 它有一个DoTerminate()的虚拟方法,用于触发OnTerminate事件处理程序。 您不会将处理程序分配给 OnTerminate 事件,也不会重写 DoTerminate() 方法。 这就是不调用您的代码的原因。

试试这个:

void __fastcall TAF_Calc_Form::Button_LUClick(TObject *Sender)
{
    Button_LU->Enabled = false;
    TUrenThread* ut = new TUrenThread(true); 
    ut->FreeOnTerminate = true;
    ut->OnTerminate = &UrenThreadTerminated; // <-- add this
    ut->Start();
}
void __fastcall TAF_Calc_Form::UrenThreadTerminated(TObject *Sender)
{
    // shouldn't this be assigning true instead of false?
    Button_LU->Enabled = false;
}