gpt4 book ai didi

c - 如何退出xlib的XNextEvent的阻塞

转载 作者:太空狗 更新时间:2023-10-29 16:23:39 42 4
gpt4 key购买 nike

在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/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com