2012-02-20 82 views
0

我创建了一个基本上执行一系列复杂计算的单个对话框应用程序。该应用程序最初是作为Win32控制台应用程序创建的,后来我决定添加一个进度条,然后将控制台应用程序转换为基于单个对话框的应用程序。该对话框上有一个进度条。在对话框的OnInitDialog()函数中,我开始计算。计算在工作线程上运行。这个线程是通过调用_beginthreadex函数创建的。线程通过使用PostMessage将消息发布到对话框来更新进度条。线程完成执行后,我调用CDialog :: OnOK()函数关闭对话框。问题是,即使关闭对话框后,应用程序也不会立即结束。即使关闭对话框,也需要将近2秒才能关闭应用程序。 任何帮助解决这个问题,高度赞赏。 谢谢。MFC线程问题 - 在所有线程完成后,程序不会结束

+0

对话框关闭后在调试器中击中。调试器打破哪些代码?什么线程是活动的? – usr 2012-02-20 20:16:15

+1

应用程序退出后(如调试版本)VisualStudio的“输出”选项卡上是否存在任何内存泄漏?这可能也需要一段时间。 – Clemens 2012-02-20 20:24:28

+0

@ xml-tools:是的,你是对的。有一些内存泄漏报告。我会研究它们并尝试修复它们。谢谢。 – Ram 2012-02-21 18:48:06

回答

0

这是因为您的工作线程仍在运行。在所有线程完成运行之前,应用程序不会终止。由于您的UI线程在工作线程之前关闭,所以窗口可能被隐藏,但该进程在工作线程完成其工作之前不会终止。

0

工作线程可能仍在运行。为了确保线程停止使用事件发信号。当用户按下对话框中的关闭按钮时,可以发信号通知事件以杀死线程。

您可以检查事件是否在复杂计算(可能是循环)中发出信号并从中断。因此停止线程没有任何问题。

while(true) 
{ 
    //Some complex task 

    DWORD dwWaitResult; 
    dwWaitResult = WaitForSingleObject(hwndShutdownEvent,0); 
    if (WAIT_OBJECT_0 == dwWaitResult) 
    { 
     break;     
    } 
} 
+0

不,情况并非如此。我所有的工作线程都结束了。问题是内存泄漏。无论如何感谢您的时间 – Ram 2012-02-21 18:49:11