为什么我的 MFC 应用无法完全退出?
Why can't my MFC app exit completely?
我制作了一个MFC应用程序,它可能有两个线程,一个用于使用UDP协议从套接字接收数据,一个是MFC应用程序的主线程。当接收到任何数据时,主线程中由新操作符创建的一些对象将被通知通过应用观察者设计模式来获取数据。问题是,有时我点击关闭系统按钮后,应用程序的GUI消失了,但在任务管理器中仍然可以找到它的进程。如果我停止数据源(UDP客户端),这个问题将永远不会发生。下面列出了其他重要的和可能有用的信息:
- 观察者设计模式是用STL容器列表实现的。我在Attach, Detach和Notify函数中使用了临界区保护。
- 我在关闭UDP套接字之前删除了观察者对象。
- 数据传输速率可能比进程数据快一点,因为关闭数据源后数据进程仍在工作。
我不知道是什么导致我的应用程序不能完全退出。
这通常是由于您创建了一个线程,但在退出应用程序时没有以编程方式退出它。线程中必须有while子句。查找它仍在运行的位置的方法是:
-
使用调试模式启动应用程序,点击右上角的退出按钮退出。
-
从任务管理器查看是否仍在运行
-
如果是,执行Debug->Break All,
-
打开线程窗口,双击每个线程,你会发现你的代码仍然在循环。
通常一个进程不会终止,因为仍然有一个前台线程在某处运行。当你想要关闭应用程序时,你必须确保你的套接字库没有运行任何线程。
首先,使用MFC,请使用基于通知的方法来获取消息到达,连接等的通知。因此,如果你有,你可以摆脱线程。
这是很容易附加到调试器和Break
查看哪些线程是存在的,等待什么。
或者,您可以使用ProcessExplorer和适当的符号配置来查看特定进程可用的线程的调用堆栈。
应用程序可以退出两种问题,一种可能是无限循环,另一种可能是等待/死锁(例如socket读取命令是阻塞调用)。您可以通过附加调试器轻松地推断出问题。
否则,请提供有关线程的进一步信息,可能的代码片段
相关文章:
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我的 c++ 代码在使用堆栈时以退出代码 11 结尾?
- 当if语句告诉程序返回0时,我的程序不会退出
- CLion 没有调试我的目标之一 - 立即"进程已完成,退出代码为 0"
- 试图调节我的 do-while 以停止在终端中退出程序.菜单不会根据需要循环使用当前语句
- 为什么我的构造函数在退出时引发分段错误
- 为什么我的 C++ 应用以退出值 -1 终止,但某些代码逻辑未执行?
- 为什么我的程序在 while 循环后退出
- 为什么GetMessage在不发送任何消息的情况下退出我的程序
- 我找不到第一个用户输入后立即退出程序的原因
- 为什么我的新分配指针会自动在程序退出上删除
- 我找不到导致我的数组在运行两次案例并退出后损坏的错误
- Gtk::在将我的gtkmm2移植到gtkmm3应用程序时,窗口显示并退出
- C++ 运行失败:退出值 2 - 我的代码出了什么问题?
- Eclipse在退出和/或启动(CDT)时编辑我的包含路径
- 为什么我的程序在调用main之前就退出了
- 为什么我的C++程序在使用 NULL 对象时静默退出
- 为什么我的安卓应用在线程退出时崩溃
- C++ exit(0) 在配置从调试更改为发布后不再立即退出我的程序
- 为什么我的所有C++程序都以0xc0000139退出