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

标签 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;

}

最佳答案

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/

相关文章:

c - 在没有 C11 线程的情况下,C 标准库函数是否是线程安全的?

c++ - 从多个线程使用 stdlib 的 rand()

c++ - MPI_send 和 MPI_Resc - 更新单个数组值

C++如何从DLL(windows)的文件名中获取进程ID?

c++ - VS2008 c++ 编译器会优化以下 if 语句吗?

c++ - 如何检测用户是否在 C++(控制台)中按下了任何键?

c++ - libsvm c++ 教程

android - 每次创建新线程时都会添加到主线程组

c++ - C++ 对象的 XML 表示

C++ Stringstream : Accepts a string, 但不是存储在变量中的字符串。为什么?