定时器实现超时功能

时间:2015-05-08 14:44:37

标签: c multithreading winapi timer

我在C中编写了一个Windows(Win32)程序,它具有一个工作线程来处理来自USB硬件设备的数据。处理一切的线程运行良好,但是我现在需要添加一个计时器来处理超时功能。我不需要回调功能,只需启动单发计时器,并能够测试天气完全没有睡觉,如下所示:

start_timout(1000);   // 1 second

while (timer_is_running())
{
  doing stuff while waiting...
  .
  .
  .
}

do stuff after timer is finished...
.
.
.

这将在工作线程内运行。

我已经看过SetTimer(),并尝试创建一个简单设置全局标志的回调函数,然后测试该标志,但永远不会设置。我不确定这是不是因为我的帖子中没有消息处理程序。

欢迎任何建议。干杯!

2 个答案:

答案 0 :(得分:2)

感谢您的回复,我的工作很快。这是我工作代码的精华:

#include <windows.h>

static void func(void)
{
  HANDLE hTimer = NULL;
  LARGE_INTEGER liDueTime;

  liDueTime.QuadPart = -5000000LL;    // 0.5 seconds
  //liDueTime.QuadPart = -20000000LL;   // 2 seconds
  //liDueTime.QuadPart = -100000000LL;  // 10 seconds


  hTimer = CreateWaitableTimer(NULL, TRUE, NULL);


  SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0);

  while (WaitForSingleObject(hTimer, 0) == WAIT_TIMEOUT)
  {
    do stuff
  }
}

此致 二加元硬币。

答案 1 :(得分:0)

SetTimer要求您在窗口中捕获WM_TIMER事件,并且最重要的是,它不是非常准确。我不建议使用它。

相反,您可以简单地创建另一个线程,让它在指定的时间段内只执行Sleep()(您可以在创建线程时将时间作为参数传递)。然后,您可以WaitForSingleObject(sleeper_thread, 0)检查超时是否已经过去。