c语言如何实现事件循环-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

c语言如何实现事件循环

2016-06-07 17:59:51 2584 7

想用c语言实现类似glib mainloop那样的事件循环机制,求思路或方向,谢谢各位大神!

取消 提交回答
全部回答(7)
  • 游客x4uu57rrcwjuo
    2020-03-17 16:59:18

    while (true) sleep(0);

    0 0
  • 游客duzwdtzqsaq3i
    2020-03-17 10:39:32

    大道至简,用while

    0 0
  • 一生有你llx
    2019-07-17 19:30:37

    struct pollfd fds[2];
    int timeout_msecs = 500;
    int ret;
    int i;
    / Open STREAMS device. /
    fds[0].fd = open("/dev/dev0", ...);
    fds[1].fd = open("/dev/dev1", ...);
    fds[0].events = POLLOUT | POLLWRBAND;
    fds[1].events = POLLOUT | POLLWRBAND;
    while(1) {

    ret = poll(fds, 2, timeout_msecs);
    if (ret > 0) {

    / An event on one of the fds has occurred. /
    for (i=0; i<2; i++) {
    if (fds[i].revents & POLLWRBAND) {
    / Priority data may be written on device number i. /
    ...
    }
    if (fds[i].revents & POLLOUT) {
    / Data may be written on device number i. /
    ...
    }
    if (fds[i].revents & POLLHUP) {
    / A hangup has occurred on device number i. /
    ...
    }
    }
    }
    }

    0 0
  • nothingfinal
    2019-07-17 19:30:36

    struct pollfd fds[2];
    int timeout_msecs = 500;
    int ret;
    int i;
    / Open STREAMS device. /
    fds[0].fd = open("/dev/dev0", ...);
    fds[1].fd = open("/dev/dev1", ...);
    fds[0].events = POLLOUT | POLLWRBAND;
    fds[1].events = POLLOUT | POLLWRBAND;
    while(1) {

    ret = poll(fds, 2, timeout_msecs);
    if (ret > 0) {

    / An event on one of the fds has occurred. /
    for (i=0; i<2; i++) {
    if (fds[i].revents & POLLWRBAND) {
    / Priority data may be written on device number i. /
    ...
    }
    if (fds[i].revents & POLLOUT) {
    / Data may be written on device number i. /
    ...
    }
    if (fds[i].revents & POLLHUP) {
    / A hangup has occurred on device number i. /
    ...
    }
    }
    }
    }

    0 0
  • xumaojun
    2019-07-17 19:30:36

    struct pollfd fds[2];
    int timeout_msecs = 500;
    int ret;
    int i;
    / Open STREAMS device. /
    fds[0].fd = open("/dev/dev0", ...);
    fds[1].fd = open("/dev/dev1", ...);
    fds[0].events = POLLOUT | POLLWRBAND;
    fds[1].events = POLLOUT | POLLWRBAND;
    while(1) {

    ret = poll(fds, 2, timeout_msecs);
    if (ret > 0) {

    /* An event on one of the fds has occurred. */  
    for (i=0; i<2; i++) {  
    if (fds[i].revents & POLLWRBAND) {  
    /* Priority data may be written on device number i. */  
    ...  
    }  
    if (fds[i].revents & POLLOUT) {  
    /* Data may be written on device number i. */  
    ...  
    }  
    if (fds[i].revents & POLLHUP) {  
    /* A hangup has occurred on device number i. */  
    ...  
    }  
    }  

    }
    }

    0 0
  • calm86104
    2019-07-17 19:30:36

    你首先要确定是哪类的 EVENT。
    好吧,我来做一个通用的回答。

    通畅,在 linux 端,我们会使用 epoll 函数来做事件循环:
    如下举例:

    image

    0 0
  • a123456678
    2019-07-17 19:30:36

    一个很 ugly (但有效)的解决方案:
    定义一个 struct Event 的队列

    struct Event event;
    while (1)
    {
        if (empty(event_queue))
            sleep(WAITING);
        else {
            event = get_first_element(event_queue);
            remove_first_element(event_queue);
            process...
        }
    }
    0 0
滑动查看更多
相关问答

17

回答

教你如何简单将OSS bucket挂载成为阿里云ECS服务器本地盘

梦丫头 2017-02-17 14:01:12 37985浏览量 回答数 17

5

回答

【阿里云】linux服务器安装nginx配置多个站点两种方法

自娱自乐 2014-03-29 14:53:12 22441浏览量 回答数 5

9

回答

阿里云ECS安装虚拟主机系统DirectAdmin开心版百分百成功的方法

hxs 2014-05-26 20:05:30 34493浏览量 回答数 9

10

回答

AMH5.0安装脚本顺便提醒是收费的每月5元。

是非良人 2014-08-31 15:13:27 20882浏览量 回答数 10

8

回答

阿里云服务器内网传输使用指南

任逍遥 2013-03-22 00:05:42 30752浏览量 回答数 8

3

回答

2020年05月编程排行榜-C语言继2015年,重新成为编程排行榜第一名

huc_逆天 2020-05-06 13:43:42 35570浏览量 回答数 3

4

回答

上传到OSS的文件md5hash值如何获取?!!

asker 2015-08-05 16:52:10 21273浏览量 回答数 4

14

回答

C语言基础 【精品问答合集】

我是管理员 2018-07-13 15:37:00 26678浏览量 回答数 14

10

回答

阿里云centos静默安装oracle

美味的小鱼 2014-08-12 14:23:44 30645浏览量 回答数 10

5

回答

C语言算法 【精品问答合集】

我是管理员 2018-07-13 15:51:28 27074浏览量 回答数 5
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载