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

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

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

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

回答

PostQuitMessage()WM_QUIT消息发布到调用线程的消息队列。 Application.Terminate()使用PostQuitMessage(). 这就是为什么在您的情况下两者都不起作用的原因,因为您在错误的线程上下文中调用它们。

因此,您可以:

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

    TThread.Queue(nil, Application.Terminate);

  • 将您自己的WM_QUIT消息发布到主线程或Application窗口,即:

    PostThreadMessage(MainThreadID, WM_QUIT, 0, 0);

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

  • WM_CLOSE向您的MainForm窗口发布消息(如果您有的话)1,因为关闭MainForm将终止应用程序,即:

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

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


以上是工作线程如何结束应用程序?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>