在紧密的循环中处理Windows事件?

时间:2011-03-16 10:57:59

标签: windows multithreading winapi cpu-usage

我为脚本语言编写了一个编译器和解释器。解释器是一个DLL('引擎'),它在一个线程中运行,可以加载许多100或1000个已编译的字节码应用程序,并将它们作为一组内部进程排除。在将一个指令移动到下一个进程之前,有一个主循环可以从每个加载的应用程序进程中获取一些指令。

编译应用程序中的字节代码指令可以是低级指令(pop,push,add,sub等),也可以是对外部函数库的调用(大多数工作都在这里完成)。这些外部库可以回调引擎以将内部进程置于休眠状态,等待特定事件,外部函数(可能在接收事件之后)将再次唤醒内部进程。如果所有内部进程都处于休眠状态(大部分时间都处于休眠状态),那么我也可以将Engine置于休眠状态,从而将CPU切换到其他线程。

然而,没有什么可以阻止某人编写一个像这样紧密循环的脚本:

,而(1)    X = 1; ENDWHILE

这意味着我的主循环永远不会进入睡眠状态,因此CPU上升到100%并锁定系统。我希望我的引擎尽可能快地运行,同时仍处理Windows事件,以便在遇到类似于上述的紧密循环时其他应用程序仍然响应。

所以我的第一个问题是如何在我的主循环中添加代码以确保处理Windows事件而不会减慢主引擎的速度,主引擎应以最快的速度运行。

此外,能够设置我的引擎可以使用的最大CPU使用率并通过调用偶尔的Sleep(1)来降低CPU使用率,这将是很好的。

所以我的第二个问题是如何降低CPU使用率到所需的水平?

引擎是用Borland C ++编写的,并调用win32 API。

提前致谢

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

虽然设计糟糕的脚本可能会让你进入无操作循环,但不要担心。 Windows旨在处理这类事情,并且不会让您的程序占用超过其公平份额的CPU。如果它确实设法获得100%,那只是因为没有其他东西想要运行。