【问题标题】:Timer event in C for Windows 32 console application用于 Windows 32 控制台应用程序的 C 中的计时器事件
【发布时间】:2019-03-17 01:08:10
【问题描述】:

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

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

【问题讨论】:

  • 也许启动一个线程,当从Sleep返回时向主线程发出信号
  • 你能给出一个C语言的代码示例吗?正如我所解释的,Sleep() 不是一个有效的选项。
  • 它阻塞了,这就是为什么你在一个线程中运行它,它是并发的。抱歉没有代码示例。
  • 使用可等待计时器,在并行线程中运行,您可以创建类似于“基本时间中断”的东西,就像在旧的 MSDOS 系统中拦截时钟中断一样。当然,在 Windows 下,其他线程在模拟中断期间继续并发运行,您必须考虑到这一点。一种在时钟代码运行时阻止对资源(即内存位置)的访问的方法是使用同步函数作为临界区、信号量等来保护敏感资源访问。
  • @Frankie_C ,是的,这正是我需要的 Visual Studio 2012 中 CRT 库的一个小型 C(非 C++)代码示例。关于信号量,当然是你的建议指出。我的应用程序在 main() 函数中运行一个大而简单的状态机解析器。计时功能只需一个线程即可,因为计时功能非常简单,只需递减非零计数器即可。计时事件可以是回调函数或 main() 检查某些共享变量(计数器)以达到零的一部分。但我需要 CRT 的纯 C 代码示例。

标签: c timer console nonblocking


【解决方案1】:

大状态机似乎是要走的路。比如:

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

【讨论】:

  • 谢谢@Lee,这是一个好方法,但就我而言,我使用for(;;) { parse( get_excitation) ;) 类型的状态机。对不起,我想和你一样在这里格式化代码,但是我找不到方法。
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 2012-06-03
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2011-03-29
  • 2010-10-20
相关资源
最近更新 更多