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