por para mentales mental emocionales eliminar ejercicios como bloqueos bloqueo ansiedad c user-interface xlib x11

para - como eliminar bloqueos mentales y emocionales



cómo salir del bloqueo del XNextEvent de xlib (3)

En Windows, el hilo de la interfaz gráfica de usuario generalmente llama a GetMessage a la espera de un mensaje, cuando otro hilo utiliza PoseMessage pone un mensaje en la cola, luego el hilo de la GUI devolverá GetMessage (dejar de bloquear).

¿Alguien puede decirme que cuando uso XNextEvent en XWindows para esperar el evento, cómo puedo "activar" el hilo de la GUI en otro hilo? ¿Hay alguna API como PoseMessage que pueda usar?


Debe usar: Bool XCheckMaskEvent (Display *, long, XEvent)

La función XCheckMaskEvent busca primero la cola de eventos y luego cualquier evento disponible en la conexión del servidor para el primer evento que coincida con la máscara especificada.

Si encuentra una coincidencia, XCheckMaskEvent elimina ese evento, lo copia en la estructura XEvent especificada y devuelve True . Los otros eventos almacenados en la cola no se descartan.

Si el evento que solicitó no está disponible, XCheckMaskEvent devuelve False y el búfer de salida se habrá descargado.


No. Esta es la razón por la cual la mayoría de los marcos de IU (Gtk, KDE, etc.) usan bucles principales personalizados para poder escuchar más fuentes de eventos.

Internamente, XNextEvent usa un socket, por lo que llama a select() para saber cuándo está disponible la entrada. Entonces puede: Llamar a ConnectionNumber(display) para obtener el descriptor de archivo que necesita pasar select()

Eso le permite escuchar varios descriptores de archivos.

Código de muestra de 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); }


Puede salir del bloqueo XNextEvent, enviándose un evento ficticio.

Window interClientCommunicationWindow; Bool x11EventLoopActive = True; // create a dummy window, that we can use to end the blocking XNextEvent call interClientCommunicationWindow = XCreateSimpleWindow(dpy, root, 10, 10, 10, 10, 0, 0, 0); XSelectInput(dpy, interClientCommunicationWindow, StructureNotifyMask); XEvent event; while(x11EventLoopActive) { XNextEvent(dpy, &event); ... }

En otro hilo, puede hacer esto para finalizar el ciclo:

x11EventLoopActive = False; // push a dummy event into the queue so that the event loop has a chance to stop XClientMessageEvent dummyEvent; memset(&dummyEvent, 0, sizeof(XClientMessageEvent)); dummyEvent.type = ClientMessage; dummyEvent.window = interClientCommunicationWindow; dummyEvent.format = 32; XSendEvent(dpy, interClientCommunicationWindow, 0, 0, (XEvent*)&dummyEvent); XFlush(dpy);