在Quake中使用CreateEvent()

时间:2012-08-16 14:48:52

标签: c winapi events game-engine quake

我很好奇在Quake中使用CreateEvent()函数。

我们在c文件中有以下定义WinMain()的全局:

static HANDLE tevent;

在WinMain()函数本身中,我们看到了:

tevent = CreateEvent(NULL, FALSE, FALSE, NULL);

如果此创建失败,游戏将退出。

然后出现在以下功能中:

void SleepUntilInput (int time)
{
    MsgWaitForMultipleObjects (1, &tevent, FALSE, time, QS_ALLINPUT);
}

最后在Quit函数中调用CloseHandle(tevent)。

我对WinAPI不熟悉,所以这给我留下了两个问题。

- CreateEvent()的这种用途是什么?

- 这是如何使SleepUntilInput()函数正常工作的?

1 个答案:

答案 0 :(得分:2)

CreateEvent返回新创建事件的句柄。

SleepUntilInput使用`MsgWaitForMultipleObjcts函数等待,直到发生以下三种情况之一:

  1. 该事件已发出信号或
  2. 输入可用,或
  3. time毫秒已过。
  4. 由于代码从不向事件发出信号,因此条件(1)永远不会发生,所以唤醒它的唯一事情是(2)或(3)。

    请注意,事件实际上并不是必需的。代码可以完成

    void SleepUntilInput (int time) 
    { 
        MsgWaitForMultipleObjects (0, NULL, FALSE, time, QS_ALLINPUT); 
    } 
    

    但是编写代码的人没有想到这一点,所以他们反而传递了一个虚拟事件。