Windows 32控制台应用程序C中的计时器事件

时间:2018-10-11 20:48:32

标签: c timer console nonblocking

我不是Windows专家,只写了几个GUI VB程序。我确实管理K&R C语言和大量汇编程序,并且在嵌入式系统和微处理器控制应用程序领域拥有35年以上的经验。所以我主要是硬件+电子产品的人。我知道,由于许多有效的原因,在Windows中不再可能使用普通的,非操作系统的控制软件或旧的DOS风格的中断。我也知道,如果要在Windows下使用受保护的中断,则应编写特殊的驱动程序并创建线程。因此,专家:如果我的问题听起来太简单或天真,我深表歉意。我进行了“搜索和研究”,但没有找到一个简单解决方案。 Non-blocking sleep timer in CTimer to implement a time-out functionUsing Timers都使用GUI或C ++或过于复杂。

我需要编写一个实现大型状态机的Windows32控制台应用程序,并且需要几个通信超时计时器以及一些其他并发进程计时器,范围从1 ms到几十分钟不等。 Sleep()将不起作用,因为自动机在等待这些事件以表明其终止时仍在继续工作。我找到了此解决方案CreateWaitableTimer with an Asynchronous Procedure Call。此代码应该在K&R C中工作吗,并且代码如何?如果我是对的,则回调函数可以包含计时器所需的小代码,而无需像Sleep()那样挂起程序。我正在使用MS Visual Studio 2012作为C编译器。对于非常简单的C解决方案的任何建议和帮助,我将非常感谢。

1 个答案:

答案 0 :(得分:0)

大状态机似乎是要走的路。像这样:

int state = STATE_POWERUP, done = 0;
DWORD timeout;

while (! done) {
    DWORD ticks = GetTickCount();

    case (state) {
    STATE_POWERUP:
       . . .
       state = STATE_INIT1;
       break;

    STATE_INIT1:
       timeout = ticks + 30;
       state = STATE_INIT2;
       break;
    STATE_INIT2:
       if (ticks < timeout) { break; }
       . . .
       state = STATE_INIT3;
       break;
    STATE_INIT3:
       . . .

    default:
        assert(0);
    }
}