在C窗口等待时间没有忙等待

时间:2011-04-19 12:45:35

标签: c++ c windows

我有一个线程,其工作是向UDP对等体发送消息。线程发送消息iff以下适用之一:

1)自上次发送消息(如超时)以来已经过了一段时间。

2)共享结构中的更新布尔标志已由其他线程引发。

我希望能够等待这些条件发生,以便我知道何时发送消息。

我能做到的最简单的方法是制作一个循环,重复直到其中一个条件满足。我担心它正在忙着等待,并且会消耗大量的CPU时间。我也不想使用sleep()。

我不介意使用C ++解决方案,只要它易于理解和实现,因为我对C ++不是很熟悉。

谢谢!

4 个答案:

答案 0 :(得分:10)

对于Windows,请使用事件(CreateEvent)而不是bool,然后使用WaitForSingleObject

答案 1 :(得分:2)

对于线程之间的信号我同意Erik。使用事件对象。

对于超时问题,您可以使用CreateWaitableTimer()和SetWaitableTimer()

要在线程中等待事件发出信号或计时器用完,可以使用wait函数WaitForMultipleObjects()。您可以将一个句柄数组(=句柄处理事件和句柄处理程序)传递给它,以等待它们发出信号。

等待函数具有不占用CPU的优点,就像轮询循环一样,因为等待是在内核级别处理的,并且线程在等待对象发出信号时被挂起。

答案 2 :(得分:0)

您最有可能想要使用线程中嵌入的回调例程。请参阅What is a “callback” in C and how are they implemented?以获取解释,并查看此wiki example中的C示例,该示例将回调实现为函数指针。使用某种类型的事件框架(如Erik等人的建议)更容易,而不是自己动手,但这是一个方便的技巧。

答案 3 :(得分:0)

我会使用WaitForMultipleObjects,监听2个事件 第一个是退出线程,第二个是完成工作。

像这样......

DWROD dwTimeOut = .....;


DWORD dwRetValue = WaitForMultipleObjects(2, hEvents, false, dwTimeOut);

if( (dwRetValue ==  WAIT_TIMEOUT) || (dwRetValue == (WAIT_OBJECT_0 + 1)))
{
  // Do Work

}
else if(dwRetValue == WAIT_OBJECT_0)
{
  // End Thread

}
else
{
  // Deal with Error
}