我曾经想知道很多相同的东西!
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,或将其置于临时低功耗模式等。
请询问更多细节!



