工作线程如何结束应用程序?
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
消息到主线程或Application
window,即:
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
我似乎遇到了工作线程知道关闭应用程序的挑战,但 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
消息到主线程或Application
window,即: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