我正在使用 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;
}
关于c++ - 当 Execute() 在 C++ Builder 中终止时,不调用 OnTerminate() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27705631/