【问题标题】:Multiple event sources in a main loop without 100% cpu usage一个主循环中的多个事件源,没有 100% 的 cpu 使用率
【发布时间】:2020-11-17 08:28:51
【问题描述】:

我用 C 语言编写了一个程序,它的主循环如下所示:

   while (running) {

     int recv = read_line(fd1, buf, sizeof(buf));
     if (recv > -1) {
       processCommand(buf);
     }
 
     while (XPending(display)) {
       XNextEvent(display, &ev); // This is blocking
       // Handle event
     }
   }

您可以看到我们有 2 个事件源,其中一个是阻塞的。

这工作正常,但这意味着我有 100% 的 CPU 使用率。通常在这样的程序中,阻塞调用会解决这个问题,但是因为我有两件事要检查,所以我不能让循环被阻塞。

这样编程的正确方法是什么:

  • CPU 未达到 100% 使用率
  • 每个循环都会检查两个事件源。

【问题讨论】:

  • 一种可能性是使用单独的线程处理源。这样,您只需要带有阻塞调用的简单循环。

标签: c linux xlib


【解决方案1】:

如前所述,“选择”或“投票”是您的朋友。获取显示器的文件描述符:

连接数(显示)

int XConnectionNumber(Display *display);

两者都返回指定显示器的连接号。在符合 POSIX 的系统上,这是连接的文件描述符。

【讨论】:

    【解决方案2】:

    在 C 中实现具有多个源的事件循环的最佳方法是使用 selectpoll

    select() 允许您等待多个文件描述符上的事件或超时。

    man page

    【讨论】:

    • 是的,但是 poll() 和 select() 都需要一个文件描述符来等待。因此,需要额外的东西来使文件描述符与每种输入事件相关联。
    猜你喜欢
    • 2010-11-16
    • 2020-09-16
    • 1970-01-01
    • 2021-06-29
    • 2012-11-03
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多