【问题标题】:Non-blocking sleep timer in CC中的非阻塞睡眠定时器
【发布时间】:2011-10-14 17:10:06
【问题描述】:

我正在为 Windows 寻找一个好的非阻塞睡眠定时器。

目前我正在使用sleep(10);,这当然是一个阻塞计时器。

我还希望它不消耗任何系统资源,例如我的睡眠定时器,它不使用任何我满意的 CPU 或系统资源。

那么,我可以使用的最佳非阻塞睡眠定时器是什么?并请附上如何使用它的示例。

谢谢。

【问题讨论】:

  • 您实际上想要完成什么?你在等什么?您能否使用命名事件(请参阅:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 您想要达到的总体结果是什么?通常 sleep 用于多线程应用程序以放弃控制。不想阻塞就不要写sleep了?
  • 所以你想阻止你的程序的执行......而不是阻止......嗯?
  • 这里有一些关于 Windows 计时器的问题。 This one,例如。那里的选项都不够好吗?
  • 非阻塞睡眠是矛盾的

标签: c windows winapi timer


【解决方案1】:

您不需要更改设计所需的 API。

一个简单的就是这个。

你可以有多个线程,一个是管理线程,一个是工作线程。 每隔 10 秒,管理器线程将唤醒创建一个新的工作线程并进入睡眠状态。 即使 Manager 处于睡眠状态,工作线程也将继续工作,这样您就有了非阻塞效果。

我不知道你对线程有多熟悉,但这里有一个非常非常基本的tutorial,它可能会让你开始使用它。

【讨论】:

  • 这看起来是最好的解决方案。唯一的问题是我目前没有任何线程。你能告诉我如何实现这个吗?
  • 不是。但正在调查它。不过我很熟悉。只是还没有在 C 中完成。
  • 查看我帖子中的教程链接我也没有在 Windows 上编码,所以我不确定教程的质量
  • 这似乎是针对 C++ 的。
【解决方案2】:

Win32 API 有SetTimer()。从该页面链接有code examples

【讨论】:

  • 我可以在非 GUI 程序中使用它吗?
  • @luacoder 你需要一个消息循环,但我认为你实际上不必显示任何窗口。
【解决方案3】:

根据 OP 最近对问题的评论,听起来好像目标是允许程序继续处理,但能够每 10 秒调用一次函数。提供此功能的一种方法是create a separate thread,其职责是每 10 秒执行一次功能。它可以使用Sleep( 10000 )来阻塞自己,然后调用函数,然后休眠,等等。

在这种情况下主线程不会被阻塞,可以继续工作。

【讨论】:

  • 是的,看起来不错。但是我的应用程序中目前没有任何线程。我该如何实施?我之前读过一些关于 System.Thread 的内容,这也是您所指的吗?或类似的东西。
  • 如果他使用 C 运行时库,他应该使用 _beginthread(),而不是 CreateThread()。
【解决方案4】:

在 Windows 上,您有以下选项:

您还应该记住,计时器回调函数将在您的应用程序的不同线程下运行。因此,如果回调函数使用与主线程相同的数据,那么您需要保护它们(使用 Mutex、CriticalSection 等)以消除多个线程同时访问。

【讨论】:

    【解决方案5】:

    这个问题的解决方案能回答你的吗?

    Timer to implement a time-out function

    问候, 图妮。

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2011-02-25
      • 2020-10-27
      相关资源
      最近更新 更多