gpt4 book ai didi

C++ - 完全挂起 Windows 应用程序

转载 作者:太空狗 更新时间:2023-10-29 20:01:09 24 4
gpt4 key购买 nike

我正在开发一个简单的 WinAPI 应用程序,并从编写我自己的断言系统开始。

我有一个定义为 ASSERT(X) 的宏,它与 assert(X) 做的事情非常相似,但有更多信息、更多选项等.

在某个时刻(当断言系统已经在运行和工作时)我意识到有问题。

假设我编写了一段代码,使用计时器执行某些操作,并且(只是一个简单的示例)此操作是在处理 WM_TIMER 消息时完成的。现在,情况改变了这段代码开始抛出断言的方式。此断言消息将每 TIMER_RESOLUTION 毫秒显示一次,并且只会淹没屏幕。

解决这种情况的选项可能是:

1) 当显示断言消息框时完全暂停应用程序运行(也可能暂停所有线程)并在关闭后继续运行

2) 为显示的断言创建一个静态计数器,并且当其中一个断言已经显示时不显示断言(但这不会暂停应用程序)

3) 将相似的断言分组并为每种断言类型只显示一个(但这也不会暂停应用程序)

4) 修改应用程序代码(例如,Get/Translate/Dispatch 消息循环),使其在有任何断言时自行挂起。这很好,但不是通用的,看起来像 hack。

在我看来,选项 1 是最好的。但我不知道如何实现这一目标。我正在寻找一种暂停运行时的方法(类似于调试器中的 Pause 按钮)。有人知道如何实现吗?

此外,如果有人知道处理此问题的有效方法 - 我将非常感谢您的帮助。谢谢。

最佳答案

了解 Windows UI 程序的工作原理对于回答这个问题很重要。

Windows UI 编程模型的核心当然是“消息”队列。消息到达消息队列并使用消息泵检索。消息泵并不特殊。它只是一个循环,用于检索一条消息一次,如果没有线程可用,则阻塞该线程。

现在为什么会收到所有这些对话框?包括 MessageBox 在内的对话框也有一个消息泵。因此,它们将从消息队列中检索消息(在 Windows 模型中, 发送消息并不重要)。这允许绘画、鼠标移动和键盘输入工作。它还将触发额外的计时器和对话框。

因此,规范的 Windows 方法是在每条消息到达时对其进行处理。它们是生活中的现实,您需要处理它们。

在您的情况下,我会考虑稍作改动。您确实希望在断言发生时保存堆栈的状态。这是断言的特殊性,值得尊重。因此,为您的对话框分拆一个线程,并在没有父 HWND 的情况下创建它。这为对话框提供了一个独立的消息队列,独立于原始窗口。由于它还有一个新线程,您可以挂起原始线程,即 WM_TIMER 到达的线程。

关于C++ - 完全挂起 Windows 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com