2010-11-03 23 views
0

对于不应该死的应用程序,应该实现while循环,afaik。 like为什么while循环用于非死亡过程?

while(){ 
    key = getKeyPress(); 
    if(key) 
    processKey(key); 

} 

当我使用“top”时,可以看到200个程序挂起。这意味着有200个循环!

我希望每个程序都可以将事件挂钩到操作系统。当这些事件发生时,操作系统调用这些程序钩子。

Web程序在初始化时执行JavaScript代码。然后,我们钩一个按钮,如果点击($('按钮'),点击(myClickJs)),我们钩定时器(setInterval)等我们不使用循环等待整个事件在页面上。这种方法节省了大量的CPU时间和资源。

为什么没有这种方法?

+3

我不明白你在问什么。为什么不存在*什么*方法? – 2010-11-03 10:44:35

回答

0

对于“不应该死的应用程序”,循环必须在某处执行。你无法绕过这个。

在您的示例代码中,它正在等待按键被按下之后才能做出响应该按键所需的操作。检测并处理按键后,如何重置它以等待另一按键(或其他类型的输入)?答案当然是使用一个循环(就像你所做的那样)。

这个“外部”循环没有以任何方式反映例程'getKeyPress()'内发生的事情。这个例程可能有两种运行模式 - 轮询和阻塞。

如果这是一个轮询例程,您的示例代码将会有效地等待,直到按下一个键。这被称为处理器的低效使用(尽管对于某些问题它是正确的解决方案)。

如果这是一个阻塞例程,线程/任务将会阻塞,直到按下某个键。当被阻塞时,这个线程/任务不会消耗任何处理器周期,这将允许它们被另一个线程/任务/进程使用。为了实现此响应,有关如何实施此阻止调用的具体细节无关紧要。重要的概念是线程/任务可能会阻塞。

如果没有“外部”循环,只有在检测和处理任何按键时才会获得一次通过,无论您是否有挂钩。

希望这会有所帮助。

+0

我只是好奇而已。常规程序期望鼠标事件,计时器,密钥,网络活动。所以阻止不应该工作。我认为CPU速度更快。所以没有人关心。 – nerkn 2010-11-03 14:40:36

+0

对于需要多个输入源的程序,阻止调用可能仍然有效,但程序设计可能会更改。 1.阻止等待任何输入。 2.确定输入的类型。 3.过程输入。 4.回到“1”。对于需要在等待输入时发生其他工作的程序,请使用另一个线程。 – Sparky 2010-11-03 15:22:15

+0

另外,虽然CPU的速度确实比以前更快,但您编写的应用程序通常不是系统中唯一使用的应用程序。当几个应用程序不必要地扼杀处理器时间时,它会影响用户的生产力和其他应用程序的体验。作为一名开发人员,我无法说出哪个应用程序对用户来说更重要,我希望他们能够获得如实际的愉快体验。 – Sparky 2010-11-03 15:28:12