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

时间:2014-12-30 12:37:31

标签: c++ multithreading

我正在使用 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;

}

1 个答案:

答案 0 :(得分:0)

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;
}