当 Execute() 在 C++ Builder 中终止时,不会调用 OnTerminate() 方法
OnTerminate() method is not called when Execute() terminates in C++ Builder
我正在使用 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;
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 当 Execute() 在 C++ Builder 中终止时,不会调用 OnTerminate() 方法