主循环中的多个事件源没有 100% cpu 使用率
Multiple event sources in a main loop without 100% cpu usage
我用 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 中实现具有多个源的事件循环的最佳方法是使用 select
或 poll
。
select()
允许您等待多个文件描述符上的事件或超时。
看看man page
如前所述,'select'或'poll'是您的朋友。要获取显示器的文件描述符:
连接数(显示)
int XConnectionNumber(Display *display);
两者都return指定显示器的连接数。在符合 POSIX 的系统上,这是连接的文件描述符。
我用 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 中实现具有多个源的事件循环的最佳方法是使用 select
或 poll
。
select()
允许您等待多个文件描述符上的事件或超时。
看看man page
如前所述,'select'或'poll'是您的朋友。要获取显示器的文件描述符:
连接数(显示)
int XConnectionNumber(Display *display);
两者都return指定显示器的连接数。在符合 POSIX 的系统上,这是连接的文件描述符。