【问题标题】:"Interactive" Sleep in C++C++ 中的“交互式”睡眠
【发布时间】:2011-12-14 02:48:50
【问题描述】:

我不久前开始学习 c++。我用 Visual Studio 2010 做了很多控制台程序,现在我想制作 win32 程序。我阅读了很多教程,现在我了解了基础知识。

我做了一个按钮来调用另一个函数。该功能在所有工作中都做得很好。但是这个函数中有 Sleep(x) 并且在睡眠没有结束时 GUI 没有响应。该功能在 60 秒内完成,因为其中有很多睡眠,但它会做所有应该做的事情,这次 GUI 没有响应。

我想我知道这个问题的根源。在我看来,问题是睡眠完全暂停了应用程序(Windows 说:没有响应)。

如何进行不冻结 GUI 的睡眠/暂停?是否有一个功能或者我必须以完全不同的方式来完成它?

提前谢谢你!

【问题讨论】:

  • 真的需要睡眠调用吗?您的函数真的需要“在一定时间内什么都不做”吗?如果是这样,请告诉我们原因。这肯定会帮助您获得更好的答案。
  • 如果函数定期执行某些操作,请考虑使用 WM_TIMER 消息。
  • 我尝试制作一个魔兽世界自动登录器。它的小兄弟(一个控制台应用程序)运行良好。 (这个版本也是除了 GUI 冻结)。我的方法如下:从ini文件中获取用户名/密码。它启动 wow.exe,但在 wow 加载时它不需要做任何事情。所以它睡了大约8秒。之后将用户名复制到剪贴板并“按” ctrl+v 等等。我知道这不是最好的方法,但这就是我能做的。我只做这样的程序来学习。这也是我问这个问题的原因。 :)
  • “我知道这不是最好的方法,但这是我能做的。”如果可行,我认为这是一个很好的解决方案。但是,请注意,在不同的 PC 上硬编码计时很困难:在每台计算机上启动 WoW 的时间取决于很多因素(性能、正在运行的其他程序等)
  • 我知道。我让它在 ini 文件中是可变的,所以你可以选择有很多秒等待。控制台兄弟很棒,但感谢社区的帮助,GUI 会更加强大。 :)

标签: c++ winapi


【解决方案1】:

在我看来问题是睡眠完全暂停应用程序

是的。

如何进行不冻结 GUI 的睡眠/暂停?

为什么你首先需要睡觉?如果该函数行为异常,您始终可以在后台线程中运行它(但请注意,这会增加相当多的复杂性和难度)。通常,您根本不需要睡觉。如果您确实必须休眠,则使其成为一个循环,直到足够的时间过去,处理来自操作系统的事件并调用Sleep(0) 产生时间片。

【讨论】:

  • 由于 OP 对 Win32 来说是新的,值得一提的是 Sleep 不会暂停应用程序,而是暂停调用它的线程。在上述情况下,它实际上是相同的,但如果接受您的建议并使用另一个线程,Sleep 只会暂停一个线程。
  • @eran:我自己有点困,所以请随时编辑和澄清。
  • 我明白了。所以我所要做的就是在主线程(GUI)可以工作并且后台可以休眠时在后台线程中运行这些代码。还是我理解不好?但是,是的,这很困难,但我目前正在寻找最简单的方法。
  • @Gaboros 让 GUI 线程只做 GUI 工作,并为程序逻辑使用另一个(或更多)线程是一种常见的做法。它确实使它变得有点困难,因为有时您必须使两者同步。
  • 我明白了。我确信在我的情况下它不需要同步,但目前我只是在学习如何将我的代码“发送”到另一个线程。 :)
【解决方案2】:

您能否将代码分成多个部分并使用计时器而不是睡眠?这将使消息泵保持运行。查看 MSDN 中关于使用计时器的这篇文章:http://msdn.microsoft.com/en-us/library/ms644901%28v=VS.85%29.aspx

【讨论】:

    【解决方案3】:

    要么将工作卸载到单独的线程(参见CreateThread),要么使用PeekMessage 等。 al 在一个紧密的循环中处理窗口消息并保持 GUI 活动。

    当然,你应该问问自己是否真的需要睡觉。正如您所说,主线程(轮询消息泵的线程)中的睡眠会阻止任何 GUI 处理。

    【讨论】:

      【解决方案4】:

      你必须使用线程。请记住,如果您的 GUI 中有一个长时间运行的进程,您必须创建一个线程并让它处理您的所有代码——在这种情况下,它包含许多睡眠指令。一旦线程完成其工作,它会通知您,然后您可以从中提取数据。

      【讨论】:

        猜你喜欢
        • 2010-12-20
        • 1970-01-01
        • 2010-12-12
        • 2017-01-02
        • 2021-05-11
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        相关资源
        最近更新 更多