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

Why can't my MFC app exit completely?

本文关键字:退出 我的 MFC 应用 为什么      更新时间:2023-10-16

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

    观察者设计模式是用STL容器列表实现的。我在Attach, Detach和Notify函数中使用了临界区保护。
  1. 我在关闭UDP套接字之前删除了观察者对象。
  2. 数据传输速率可能比进程数据快一点,因为关闭数据源后数据进程仍在工作。

我不知道是什么导致我的应用程序不能完全退出。

这通常是由于您创建了一个线程,但在退出应用程序时没有以编程方式退出它。线程中必须有while子句。查找它仍在运行的位置的方法是:

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

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

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

  4. 打开线程窗口,双击每个线程,你会发现你的代码仍然在循环。

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

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

这是很容易附加到调试器和Break查看哪些线程是存在的,等待什么。

或者,您可以使用ProcessExplorer和适当的符号配置来查看特定进程可用的线程的调用堆栈。

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

否则,请提供有关线程的进一步信息,可能的代码片段