为什么我的MFC应用程序无法完全退出?

时间:2011-08-11 11:30:46

标签: c++ multithreading mfc

我制作了一个MFC应用程序,可能有两个线程,一个用于使用UDP协议从套接字接收数据,另一个是MFC应用程序的主线程。当接收到任何数据时,将通过应用观察者设计模式通知由新操作员在主线程中创建的一些对象来获取数据。问题是,有时在我点击关闭系统按钮后,应用程序的GUI消失了,但仍然可以在任务管理器中找到它的进程。如果我停止数据源(UDP客户端),这个问题永远不会发生。其他重要且可能有用的信息如下:

  1. Observer设计模式是使用STL容器列表实现的。我在Attach,Detach和Notify函数中使用了临界区保护。
  2. 我在关闭UDP套接字之前删除了观察者对象。
  3. 数据传输速率可能比流程数据快一点,因为关闭数据源后,数据流程仍然有效。
  4. 我无法弄清楚我的应用无法完全退出的原因。请给我一些线索。

3 个答案:

答案 0 :(得分:1)

这通常是由您创建的线程引起的,而不是在退出应用程序时以编程方式退出。你的线程中必须有一个while子句。找到它仍在运行的方式是:

  1. 使用调试模式启动应用程序,然后单击右上角的退出按钮退出。

  2. 从任务管理器检查并查看它是否仍在运行

  3. 如果是,请执行Debug-> Break All,

  4. 打开线程窗口,双击每个线程,您将找到代码仍在循环的位置。

答案 1 :(得分:0)

通常,进程不会终止,因为某处仍然存在 foreground 线程。当您要关闭应用程序时,必须确保套接字库没有运行任何线程。

答案 2 :(得分:0)

首先,使用基于通知的方法,请使用基于通知的方法来获取有关消息到达,连接等的通知。因此,如果有,可以删除线程。

很容易附加到调试器,Break看看哪些线程存在并等待什么。

或者,您可以使用具有正确符号配置的ProcessExplorer来查看特定进程可用的线程的调用堆栈。

应用程序可以退出两种问题,一种可能是无限循环,另一种可能是等待/死锁(例如,套接字读取命令是阻塞调用)。您可以通过附加到调试器轻松推断出问题。

否则请提供有关线程的更多信息,可能的代码段。