您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

您将如何实现基本的事件循环?

您将如何实现基本的事件循环?

我曾经想知道很多相同的东西!

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,或将其置于临时低功耗模式等。

请询问更多细节!

其他 2022/1/1 18:35:57 有473人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶