工作线程如何结束应用程序?

How can a worker thread end the application?

我似乎遇到了工作线程知道关闭应用程序的挑战,但 PostQuitMessage()Application.Terminate() 似乎都不起作用。应用程序只是没有退出,没有错误。

我是否必须设置一个标志才能从主线程调用其中一个,还是有其他技巧?

线程检查更新版本并调用更新程序来替换 .exe(一旦它不再被锁定)。调用updater后需要退出应用

PostQuitMessage()post向调用线程的消息队列发送一条WM_QUIT消息。 Application.Terminate() 使用 PostQuitMessage()。这就是为什么两者都不适用于您的情况,因为您在错误的线程上下文中调用它们。

因此,您可以:

  • 标记主线程以尽早调用 PostQuitMessage()/Application.Terminate(),例如使用 TThread.Queue():

    TThread.Queue(nil, Application.Terminate);

  • post你自己的WM_QUIT消息到主线程或Applicationwindow,即:

    PostThreadMessage(MainThreadID, WM_QUIT, 0, 0);

    PostMessage(Application.Handle, WM_QUIT, 0, 0);

  • post 一封 WM_CLOSE 消息给您的 MainForm window(如果您有的话)1,因为关闭 MainForm 将终止应用程序,即:

    PostMessage(Application.MainForm.Handle, WM_CLOSE, 0, 0);

    1:小心这个! TWinControl.Handle 属性 不是线程安全的。如果您在主线程正在(重新)创建 window 的过程中在工作线程中读取 MainForm 的 Handle 属性,可能会发生不好的事情!

雷米有一个很好的答案。

如果您正在使用 Delphi 线程(您的线程派生自 TThread),那么您可以使用 Synchronize 方法你的线程到 运行 主线程上下文中的例程,然后在那个例程中(主线程 运行 )你可以调用 Application.Terminate

参见:http://docwiki.embarcadero.com/Libraries/Sydney/en/System.Classes.TThread.Synchronize