- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在windows下,GUI线程通常调用GetMessage来等待消息,当另一个线程使用 PoseMessage 将消息放入队列时,则GUI 线程将返回 GetMessage(退出阻塞)。
谁能告诉我,当我在 XWindows 下使用 XNextEvent 等待事件,如何在另一个线程中“唤醒”GUI 线程。有没有一些我可以使用像 PoseMessage 这样的 API 吗?。
最佳答案
没有。这就是为什么大多数 UI 框架(Gtk、KDE 等)使用自定义主循环来监听更多事件源的原因。
在内部,XNextEvent 使用套接字,因此它调用 select()
来了解输入何时可用。调用ConnectionNumber(display)
获取需要传递给select()
这允许您监听多个文件描述符。
示例代码来自 http://www.linuxquestions.org/questions/showthread.php?p=2431345#post2431345
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
Display *dis;
Window win;
int x11_fd;
fd_set in_fds;
struct timeval tv;
XEvent ev;
int main() {
dis = XOpenDisplay(NULL);
win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 256, 256, \
0, BlackPixel (dis, 0), BlackPixel(dis, 0));
// You don't need all of these. Make the mask as you normally would.
XSelectInput(dis, win,
ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | StructureNotifyMask
);
XMapWindow(dis, win);
XFlush(dis);
// This returns the FD of the X11 display (or something like that)
x11_fd = ConnectionNumber(dis);
// Main loop
while(1) {
// Create a File Description Set containing x11_fd
FD_ZERO(&in_fds);
FD_SET(x11_fd, &in_fds);
// Set our timer. One second sounds good.
tv.tv_usec = 0;
tv.tv_sec = 1;
// Wait for X Event or a Timer
int num_ready_fds = select(x11_fd + 1, &in_fds, NULL, NULL, &tv);
if (num_ready_fds > 0)
printf("Event Received!\n");
else if (num_ready_fds == 0)
// Handle timer here
printf("Timer Fired!\n");
else
printf("An error occured!\n");
// Handle XEvents and flush the input
while(XPending(dis))
XNextEvent(dis, &ev);
}
return(0);
}
关于c - 如何退出xlib的XNextEvent的阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592292/
我正在尝试使用 XLib 捕捉按键事件。但由于某些原因,XNextEvent 无法正常工作。我没有收到任何错误,但看起来我的程序卡在了“XNextEvent”调用行。这是我的代码: #include
我有以下应用程序。 #include #include int main(int /*argc*/, char */*argv*/[]) { FWApplication::Initiali
我正在使用 xlib 获取键盘输入我想模拟窗口的 getAsynckeystate() 以检查是否按下了按钮我尝试使用计时器来修复结果但它仍然坏了。即使同时按下或释放其他键(现在不工作),如果按住“z
我是一名优秀的程序员,十分优秀!