0

我想为我的控制台应用程序制作“引擎”,它将计算经过的时间,并在经过一定时间后强制应用程序执行基于时间的事件。我考虑为教育目的创建一个简单的基于文本的策略游戏(不是为了家庭作业,只是为了我)。

我试图创建引擎,但我没有走得太远。我不知道如何应用基于时间的事件来中断应用程序中当前待处理的操作等,首先是我如何做到的:

#include <stdio.h>
#include <conio.h>
#include <Windows.h>
void _sleep(int t);
int main()
{
int seconds_passed = 0; //counts how much time passed since application started
while(1)
{
    //if(seconds_passed == 100) ... time based action
_sleep(1000);
printf("test");
seconds_passed += 1;
}

return 0;
}


void _sleep(int t) 
{ 
    int i;
    for (i = 0; i < (t/100); i++) 
    { 
        Sleep(100); 
    if (kbhit()!= 0)
        {
            getch();
            break; 
    }
    }
}

我试图从 windows.h 中创建类似于 Sleep() 的功能,但能够在按下键时打破延迟(我不知道我是否走正确的方式) - 在循环中它将开始“时间流逝”,但我希望它独立于其余代码,因此它将静默工作并控制其余代码中的操作。我在以下任何事情上都需要帮助:

- 使用键盘中断 _sleep() 函数不应自动增加“经过的秒数”

-如何使计时器独立于代码中发生的动作?我考虑过创建一些可以每秒破坏整个 while(1) 循环的东西(可能是我修改后的 _sleep 函数),增加计数器并返回它破坏的代码部分(它会滥用 scanf() 应用程序中的操作但现在不是问题)

-我听说 select() 函数可能在这里有用,有人对此有任何经验,可以告诉我更多信息吗?

4

1 回答 1

0

不知道这是否是一个可用的答案,但是当我构建一个简单的游戏时,我以这种方式使其成为多线程:

  1. 当用户做某事时,事件线程会将消息推送到线程安全的消息队列中。
  2. “游戏”线程读取消息队列,处理数据,将输出渲染到屏幕上,然后休眠一段时间。

通过这种方式,事件线程可以保持阻塞,直到用户输入发生,而游戏逻辑和输入/输出以简单的同步方式完成。Windows 有一个你可以使用的线程库(虽然我还没有使用过那个,因为我总是在 linux 上使用 boost 线程或 posix 线程。)

于 2013-01-19T16:01:41.593 回答