1

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

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

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() 函数正常工作?

4

1 回答 1

2

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

SleepUntilInput使用 `MsgWaitForMultipleObjcts 函数等待三件事之一发生:

  1. 事件已发出信号,或
  2. 输入可用,或
  3. time毫秒已经过去。

由于代码从不发出事件信号,因此条件 (1) 永远不会发生,因此唯一能唤醒它的是 (2) 或 (3)。

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

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

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

于 2012-08-16T15:00:24.413 回答