我曾经想知道很多相同的东西!
GUI主循环如下所示,为伪代码:
void App::exec() {
for(;;) {
vector<Waitable> waitables;
waitables.push_back(m_networkSocket);
waitables.push_back(m_xConnection);
waitables.push_back(m_globalTimer);
Waitable* whatHappened = System::waitOnAll(waitables);
switch(whatHappened) {
case &m_networkSocket: readAndDispatchNetworkEvent(); break;
case &m_xConnection: readAndDispatchGuiEvent(); break;
case &m_globalTimer: readAndDispatchTimerEvent(); break;
}
}
}
什么是“等待”?好吧,这取决于系统。在UNIX上,它称为“文件描述符”,而“ waitOnAll”是:: select系统调用。在UNIX上,所谓的vector<Waitable>
是a ::fd_set
,实际上是通过“ whatHappened”查询的FD_ISSET
。实际的等待句柄以各种方式获取,例如m_xConnection
可以从:: XConnectionNumber()获取。X11还提供了一个高层次的,可移植的API为这一点- :: XNextEvent例行() -但如果你使用,你将无法等待几个事件源 同时 。
封锁如何运作?“ waitOnAll”是一个系统调用,告诉操作系统将您的进程置于“睡眠列表”中。这意味着在其中一个等待对象上发生事件之前,不会给您任何cpu时间。那么,这意味着您的进程处于空闲状态,消耗了0%的cpu。当事件发生时,您的进程将对此做出短暂反应,然后返回空闲状态。GUI应用程序几乎将所有 时间 都 花在空闲上。
睡眠时所有cpu周期会怎样?依靠。有时,另一个过程将对其有用。否则,您的操作系统将忙于循环cpu,或将其置于临时低功耗模式等。
请询问更多细节!