【发布时间】:2019-03-17 01:08:10
【问题描述】:
我不是 Windows 专家,只写过几个 GUI VB 程序。我确实管理 K&R C 语言和许多汇编程序,并且在嵌入式系统和微处理器控制应用程序方面拥有 35 年以上的经验。所以我主要是硬件+电子人。我知道,由于许多正当的原因,在普通的非操作系统控制软件或旧 DOS 样式中使用的中断在 Windows 中不再可能。我也知道如果要在 Windows 下使用受保护的中断,则应该编写特殊的驱动程序并创建线程。所以专家:如果我的问题听起来太简单或太天真,我深表歉意。我进行了“搜索和研究”,但没有找到简单 的解决方案。 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 解决方案,我非常感谢任何建议和帮助。
【问题讨论】:
-
也许启动一个线程,当从
Sleep返回时向主线程发出信号 -
你能给出一个C语言的代码示例吗?正如我所解释的,Sleep() 不是一个有效的选项。
-
它阻塞了,这就是为什么你在一个线程中运行它,它是并发的。抱歉没有代码示例。
-
使用可等待计时器,在并行线程中运行,您可以创建类似于“基本时间中断”的东西,就像在旧的 MSDOS 系统中拦截时钟中断一样。当然,在 Windows 下,其他线程在模拟中断期间继续并发运行,您必须考虑到这一点。一种在时钟代码运行时阻止对资源(即内存位置)的访问的方法是使用同步函数作为临界区、信号量等来保护敏感资源访问。
-
@Frankie_C ,是的,这正是我需要的和 Visual Studio 2012 中 CRT 库的一个小型 C(非 C++)代码示例。关于信号量,当然是你的建议指出。我的应用程序在 main() 函数中运行一个大而简单的状态机解析器。计时功能只需一个线程即可,因为计时功能非常简单,只需递减非零计数器即可。计时事件可以是回调函数或 main() 检查某些共享变量(计数器)以达到零的一部分。但我需要 CRT 的纯 C 代码示例。
标签: c timer console nonblocking