栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

请询问更多细节!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660588.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号