debugging - 如何调试并解决 'DisconnectedContext'崩溃?

标签 debugging crash c++-cli

我有一个 GUI 应用程序,它连接到传感器、收集数据并使用 BackgroundWorker 线程在后台处理数据。

就目前情况而言,我正在使用 ProgressChanged 将数据发布到 GUI,这似乎一开始就运行良好。此后我提高了数据速率并发现了一个问题;如果软件运行几分钟,处理器使用量似乎会增加,直到我机器上的两个内核都达到接近 100%,此时,我收到一条错误,内容如下:

Managed Debugging Assistant 'DisconnectedContext' has detected a problem in 'myapp.exe'. Additional Information: Context 0xe2ba0 is disconnected. Releasing the interfaces from the current context (context 0xe2d10). This may cause corruption or data loss.

我在网上读到了一些内容,这些内容表明,如果 GUI 应用程序无法足够快地发送消息,则可能会发生这种情况。我注意到如果我快速调整窗口大小(即泵入更多消息),我可以更快地引发相同的崩溃,这支持我认为的理论吗?

所以这里的问题是:

  1. 是否有人同意我关于消息泵的假设?
  2. 还有其他解释吗?
  3. 有什么方法可以证明这一点(也许可以查看队列中的消息数量)?
  4. 这些不良代码味道是否表明我的处理方式是错误的?

如有任何建议,我们将不胜感激。

最佳答案

这听起来像是一个非常具体的问题,我认为这就是为什么还没有人回答的原因,但我认为我可以帮助解决问题 #3。

Spy++应该能够看到发送到您窗口的消息。我认为您可以使用它来观察消息泵送到您的 GUI 并进行调整大小测试。如果您看到尝试处理的消息大量增加,则可能会证实您的假设。

顺便说一句,我读到您也许可以将主线程单元从 STAThread 更改为 MTAThread,以使此 MDA 消失。

也许您可以修改您的应用程序,将传感器读数输出到文件中或以不同的机制将它们排队,而不是不断更新 GUI。 HTH。

关于debugging - 如何调试并解决 'DisconnectedContext'崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2048731/

相关文章:

ios - 奇怪的 iOS tableView/CALayer 崩溃

c# - C++/命令行界面 : How do I declare abstract (in C#) class and method in C++/CLI?

.net - 非托管DLL加载路径

qt - QTreeView 中的 QModelIndexList 提供调试断言

c++ - QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

c# - 共享点 2010 "unhandled win32 exception occurred in W3WP.EXE"

crystal-reports - Crystal 报表SetDataSource上的Appcrash

android - RecyclerView 添加了一个 "empty"布局项,当我单击它时,应用程序崩溃了

c# - 使用 C++/CLI 进行 100% 托管开发有哪些优势?

Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)