我为脚本语言编写了一个编译器和解释器。解释器是一个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。
提前致谢
答案 0 :(得分:0)
答案 1 :(得分:0)
虽然设计糟糕的脚本可能会让你进入无操作循环,但不要担心。 Windows旨在处理这类事情,并且不会让您的程序占用超过其公平份额的CPU。如果它确实设法获得100%,那只是因为没有其他东西想要运行。