有没有办法在 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
大家好 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