gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:35 24 4
gpt4 key购买 nike

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

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

最佳答案

大状态机似乎是可行的方法。像这样的东西:

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);
}
}

关于c - C for Windows 32 控制台应用程序中的计时器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52768722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com