工作线程如何结束应用程序?
我似乎遇到了工作线程知道关闭应用程序的挑战,但既不工作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 的属性,可能会发生不好的事情!