如何查找 win32 对话框绘图挂起的原因



我有一个win32应用程序,它可以非常快速地更新对话框中的许多矩形。(现在通过bitblt(一点双缓冲(,在它是一种不同的方法之前 - 没关系(。

随机时间过去后 - 随机对话框(来自该应用程序,带有更新矩形(只是挂在我的 PC 上。通过悬挂,我的意思是它的重绘挂起,如果我按下一个弹出它工作的菜单按钮,但对话框没有显示任何东西只是卡住。它一直卡住,直到调整大小!或应用程序重新启动,ofc。

这只发生在我带有 3 台台式机(通过不同的 GPU 控制(的"快速"PC 上。我的"慢"笔记本电脑无法重现这一点,或者也许需要更多的时间来重现这一点(不是晚上,比如说(,因为它更慢?

我在 c++ 方面真的很新,Windows 对话框编程 - 我可能误用了某些东西或做错了什么。 我检查了我能检查的所有内容,重新访问了有关对话框(以及每个绘图功能(用法的Microsoft教程,检查了所有内容-没有找到任何东西。

也许有人可以为我提供比禁用随机功能更聪明的东西,然后等待它会挂起吗?我想了解为什么它会崩溃(挂起(,以及为什么这样。

操作系统: Microsoft视窗 7 64编译器:Visual Studio 2013

补充:调试器停止时:主线程仅显示主对话框的入口。对话框功能,仅此而已。Ofc 该线程正在运行所有其他对话框,但这些对话框是从 DialogBox 调用的主对话框运行的。绘图是由不同的线程完成的,它甚至没有注意到对话框挂起。主线程不会"挂起",因为其他对话框运行良好。如果调整大小,"挂起"对话框是固定的,太奇怪了。

通过不同的线程绘制意味着:对话框由主线程运行,其他线程(实际上是几个线程并且优先级低于其他线程(负责这些对话框的biblt和其他绘图逻辑操作(因为最多 600 个矩形可以更新到 100Hz,它很好地绘制了 CPU(。我确实解决了关键部分的问题,并在使用不当时释放资源,但我要做的第一件事是 - 重新检查这些。

你根本不应该从其他线程中绘制。

但是,单个线程绘制到位图(即在内存中(是安全的,然后将该位图交给主线程进行 bitblt'ing。从某种意义上说,这可以扩展,您可以让多个线程准备多个位图,并让主线程依次对每个位图进行位图处理。

最新更新