c - xlib के XNextEvent को अवरुद्ध करने के तरीके को कैसे छोड़ें




user-interface x11 (2)

आप खुद को एक डमी घटना भेजकर, अवरुद्ध XNextEvent को छोड़ सकते हैं।

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);
  ...
}

एक और धागे में आप लूप को समाप्त करने के लिए ऐसा कर सकते हैं:

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);

विंडोज़ के तहत, जीयूआई थ्रेड आमतौर पर संदेश की प्रतीक्षा करने के लिए GetMessage को कॉल करता है, जब कोई अन्य धागा PoseMessage का उपयोग कतार में एक संदेश डालता है, तो GUI थ्रेड GetMessage (अवरोध छोड़ने) को वापस कर देगा।

क्या कोई मुझे बता सकता है, जब मैं XWextEvent का उपयोग XWindows के तहत ईवेंट की प्रतीक्षा करने के लिए करता हूं, तो मैं एक और थ्रेड में GUI थ्रेड को "जागृत" कैसे कर सकता हूं। क्या कुछ एपीआई जैसे पॉज़मेसेज मैं उपयोग कर सकता हूं?


आपको इसका उपयोग करना चाहिए: बूल XCheckMaskEvent (प्रदर्शन *, लंबा, XEvent)

XCheckMaskEvent फ़ंक्शन पहले ईवेंट कतार की खोज करता है, और फिर निर्दिष्ट मास्क से मेल खाने वाली पहली घटना के लिए सर्वर कनेक्शन पर उपलब्ध कोई भी ईवेंट।

यदि यह एक मैच पाता है, तो XCheckMaskEvent उस ईवेंट को हटा देता है, इसे निर्दिष्ट XEvent संरचना में कॉपी करता है, और True देता है। कतार में संग्रहीत अन्य घटनाओं को त्याग दिया नहीं जाता है।

यदि आपके द्वारा अनुरोधित ईवेंट उपलब्ध नहीं है, तो XCheckMaskEvent False रिटर्न देता है, और आउटपुट बफर फ़्लश हो जाएगा।





x11