在主应用程序终止上正常终止线程

时间:2010-05-11 20:33:16

标签: winapi

我有一个创建线程的无模型对话框,如果对话框中的取消按钮被命中,则设置变量bCancel,该线程会定期检查该线程,然后立即跳转到其清理代码。它工作正常。我甚至可以从其他地方向对话框发送WM_COMMAND ... ID_CANCEL,它的工作方式相同。但是当我尝试从主应用程序窗口的WM_CLOSE处理程序将ID_CANCEL发送到对话框时它不起作用(即用户试图在此线程运行时关闭整个应用程序。)尽管我可以告诉一些事情只是终止线程在它可以执行清理代码之前从外部。这听起来不错吗?我能做些什么。

(对话框的ID_CANCEL处理程序中有一个关键部分我没有提及 - 不确定它有多相关。(bCancel设置在这个关键部分,线程在同一个关键部分执行清理代码。)< / p>

2 个答案:

答案 0 :(得分:1)

并非任何人仍然感兴趣,但在主应用程序WM_CLOSE处理程序中我设置bClos​​eApp = TRUE,然后将ID_CANCEL发送到对话框,然后检查线程是否处于活动状态。如果是,我返回0(从而绕过WM_CLOSE的默认DestroyWindow。)然后在线程退出代码I PostMessage(... WM_CLOSE ...)到主应用程序窗口,如果bClos​​eApp == TRUE。

在实现上述内容之前,我发现在主应用程序的WM_CLOSE处理程序中,有问题的线程由于某种原因自动暂停(这让我感到惊讶),这是一个复杂的因素,因为我无法等待线程终止而在WM_CLOSE处理程序中。

答案 1 :(得分:0)

设置线程的bCancel之后,对话框代码应该等待线程句柄发出信号(因此被破坏),这样你就可以使用线程句柄上的一个等待###函数(当然有一个理智的超时值) ),因此应用程序将等待一小部分线程清理被调用。