【发布时间】:2011-08-11 11:30:46
【问题描述】:
我制作了一个 MFC 应用程序,它可能有两个线程,一个用于使用 UDP 协议从套接字接收数据,一个是 MFC 应用程序的主线程。当接收到任何数据时,一些由 new 运算符在主线程中创建的对象将被通知通过应用观察者设计模式来获取数据。问题是有时我点击关闭系统按钮后,应用程序的 GUI 消失了,但在任务管理器中仍然可以找到它的进程。如果我停止数据源(UDP 客户端),这个问题将永远不会发生。下面列出了其他重要且可能有用的信息:
- 观察者设计模式是用 STL 容器列表实现的。我在 Attach、Detach 和 Notify 函数中使用了临界区保护。
- 我在关闭 UDP 套接字之前删除了观察者对象。
- 数据传输速率可能比进程数据快一点,因为关闭数据源后数据进程仍在工作。
我无法弄清楚我的应用无法完全退出的原因。请给我一些线索。
【问题讨论】:
-
发布第二个线程开始的一些代码。
-
第二个线程由socket对象创建。我从codeproject得到socket库,我觉得不会有什么错误。
-
在调试器下运行程序。关闭主窗口。执行 Break 命令,打开 Threads 窗口,看看会发生什么。顺便说一句,从 CodeProject 下载的库可能有错误,或者您自己的代码缺少一些清理函数调用。
-
我想我找到了问题的原因。当我按照你的方法调试我的应用程序时,我发现主线程总是阻塞在 COleDispatchDriver::ReleaseDispatch 函数中。下一行吹这个函数是Visual Studio 2008的线程窗口中的ccccccc()。我想它一定是我之前动态创建的activex对象,被删除工作线程仍在操作这些对象。所以调度操作员无法正常完成。我该如何解决?如何正确完整地动态删除一个activex控件?
标签: c++ multithreading mfc