C 用于实现超时功能的计时器

C 用于实现超时功能的计时器,c,multithreading,winapi,timer,C,Multithreading,Winapi,Timer,我正在用C编写一个Windows(Win32)程序,它有一个工作线程来处理来自USB硬件设备的数据。线程处理一切都很好,但是我现在需要添加一个计时器来处理超时函数。我不需要回调函数,只需要启动一个单次定时器,并且能够在不睡觉的情况下测试它是否完成,比如: start_timout(1000); // 1 second while (timer_is_running()) { doing stuff while waiting... . . . } do stuff aft

我正在用C编写一个Windows(Win32)程序,它有一个工作线程来处理来自USB硬件设备的数据。线程处理一切都很好,但是我现在需要添加一个计时器来处理超时函数。我不需要回调函数,只需要启动一个单次定时器,并且能够在不睡觉的情况下测试它是否完成,比如:

start_timout(1000);   // 1 second

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

do stuff after timer is finished...
.
.
.
这将在工作线程内部运行

我研究了SetTimer(),并尝试创建一个回调函数,该函数只设置一个全局标志,然后测试该标志,但从未设置过。我不确定这是否是因为我的线程中没有消息处理程序


欢迎提出任何建议。。干杯

SetTimer要求您在窗口中捕获WM_定时器事件,除此之外,它不是非常准确。我不建议使用它


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

谢谢您的回复,我有一些东西工作得很快。以下是我工作代码的精髓:

#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
  }
}
#包括
静态无效函数(无效)
{
句柄hTimer=NULL;
大整数liDueTime;
liDueTime.QuadPart=-5000000LL;//0.5秒
//liDueTime.QuadPart=-20000000LL;//2秒
//liDueTime.QuadPart=-10000000ll;//10秒
hTimer=CreateWaitableTimer(NULL、TRUE、NULL);
SetWaitableTimer(hTimer和liDueTime,0,NULL,NULL,0);
while(WaitForSingleObject(hTimer,0)=等待超时)
{
做事
}
}
问候,,
Toonie.

由于您没有消息泵,因此不调用TimerProc也就不足为奇了。创建线程只是为了实现超时是一种效率极低的方法。OP使用
SetWaitableTimer
是一个更好的解决方案。拜托,难道没有人会考虑使用这个答案中推荐的技术吗?嗨,吉姆。为了记录在案,我使用了一个工作线程,它实现了一个相当复杂的状态机,其中需要实现超时只是其中的一小部分。该线程在应用程序的整个运行时都保持运行,创建该线程是为了使GUI保持良好的响应性。@JimMischel显然,您在启动时只创建一次“超时”线程,而不是每次需要超时时都创建一次。。。那太愚蠢了。SetWaitableTimer与SetTimer有很大的不同,SetTimer是op所拥有的。前者在旧版本的Windows中不起作用。