【问题标题】:C builder RAD 2010 RTL/VCL Application->Terminate() Function NOT TERMINATING THE APPLICATIONC builder RAD 2010 RTL/VCL Application->Terminate() 函数未终止应用程序
【发布时间】:2011-02-10 18:04:55
【问题描述】:

我这里也描述了一个问题:http://www.delphigroups.info/3/9/106748.html

我尝试了几乎所有形式的在代码中的任何地方放置 Application->Terminate() func,跟随而不是 'return 0'、'ExitProcess(0)'、'ExitThread(0)'、exit(0)。没有工作变体关闭应用程序。相反,Application->Terminate() 语句之后的代码正在运行。

我的应用中有两个或更多线程。我尝试在执行后线程和主线程中调用终止函数。

这也与 CodeGuard / madExcept 无关(据我所知)(我已将其关闭再打开,没有效果)。 CodeGuard 转向也没有成功。

唯一有效的代码变体是将 Application->Terminate() 调用放置到任何表单按钮的 OnClick 处理程序中。但这不符合我的需要。我需要在任何地方终止。

我应该怎么做才能终止 C++ Builder 2010 应用程序中的所有线程,然后终止进程?

【问题讨论】:

    标签: c++builder vcl rad


    【解决方案1】:

    Application->Terminate() 不会立即关闭应用程序,它只是表示您要关闭应用程序。

    Terminate 调用 Windows API PostQuitMessage 函数执行 有序关闭应用程序。 不是立即终止。

    在您的函数中调用Application->ProcessMessages(),然后检查Application->Terminated 属性是否为真。

    对于使用 计算密集型循环,调用 定期处理消息,并且 还要检查终止以确定 是否中止计算和 允许应用程序终止

    例如:

    void Calc()
    {
      for (int x = 0; x < 1000000; ++x)
      {
        // perform complex calculation
    
        // check if need to exit
        Application->ProcessMessages();
        if (Application->Terminated)
        {
          break;
        } // end if
      } // end for
    
      // clean up
    } 
    

    【讨论】:

    • 但是应该满足什么条件呢?我等待应用程序关闭大约 2 分钟,但没有任何反应..
    • 我发现在任何地方真正终止我的程序的唯一方法是调用这些序列:FormDestroy(); // 还有我放在这里的任何内存空闲块 TerminateProcess(GetCurrentProcess(), 0)
    • @ergey 我用一个例子扩展了我的答案。
    • 谢谢!它确实解决了问题。现在我通过 App->Terminate() 终止,然后在循环中调用 ProcessMessages() 并检查 Terminated 标志,然后从子线程返回。但我想知道 RTL 何时真正设置此标志?在终止主线程或仅关闭 VCL/RTL 之后?但如果他们这样做,我理论上不能调用任何 stdlib/stdio 函数,因为 RTL 已关闭,或者终止标志的另一个含义。
    • @ergey。来自帮助:ProcessMessages 在收到 WM_QUIT 消息时将 Terminated 设置为 true。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多