有没有办法在 C 中的 ubuntu 循环中读取 while 循环内的鼠标滚轮数据而不锁定 while 循环?

Is there a way to read mouse wheel data inside while loop without locking while loop in ubuntu in C?

大家好 C 和 C++ 的高手们。 我正在尝试使用读取功能在 while 循环中获取鼠标滚轮数据。

我在Ubuntu20.04,使用C语言

这是我到目前为止所做的简短代码。 “读取”功能一直阻塞 while 循环并等待输入。 我想在没有输入的情况下处理while循环

有什么办法可以实现这个目标吗?或者有没有我可以使用的图书馆?有其他方法就不用读函数了。

谢谢大家

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <linux/input.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
  int fd;
  struct input_event event_data;

  if ((fd = open("/dev/input/event19", O_RDONLY)) == -1) {  // mice mouse0 event19
    perror("opening device");
    exit(EXIT_FAILURE);
  }

  // wheel data: 8 2 +-1 11 2 +-120

  while (1) {
    read(fd, &event_data, sizeof(event_data));
    if (((event_data.code == 8) || (event_data.code == 6)) && (event_data.type == 2) &&
        ((event_data.value == 1) || (event_data.value == -1))) {
        printf("- %d %d: Value=%d\n", event_data.code, event_data.type,
            event_data.value);
    } else if (event_data.code != 0) {
        printf("- %d %d: Value=%d\n", event_data.code, event_data.type,
            event_data.value);
    }
    printf("\nCheck while\n");
  }

  return 0;
}

我想我们有两种方法:
第一种是使用多线程:一个线程用于读取输入,另一个线程用于主逻辑。例如 https://www.geeksforgeeks.org/multithreading-c-2/
第二次像这样使用非阻塞标志

int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
while (1)
{

    if (-1 != read(fd, &event_data, sizeof(event_data)))
    {
        if (((event_data.code == 8) || (event_data.code == 6)) && (event_data.type == 2) &&
            ((event_data.value == 1) || (event_data.value == -1)))
        {
            printf("- %d %d: Value=%d\n", event_data.code, event_data.type,
                   event_data.value);
        }
        else if (event_data.code != 0)
        {
            printf("- %d %d: Value=%d\n", event_data.code, event_data.type,
                   event_data.value);
        }
    }

    printf("\nCheck while\n");
}

上面的代码片段将为 non-blocking 访问配置这样的描述符。如果调用 read 时数据不可用,则系统调用将失败,return 值为 -1 并且 errno 设置为 EAGAIN。有关详细信息,请参阅 fnctl 手册页

参考:Non-blocking call for reading descriptor