2016-11-08 3 views
0

Hat jemand irgendwelche Ideen, wie kann ich meine Haupt-Thread Ereignisschleife erhalten, die wie folgt aussieht:Auslöser von Thread zu Hauptthread in XCB Ereignisschleife

const int MY_CUST_MSG(877); 
xcb_generic_event_t *event; 
    while (event = xcb_wait_for_event(connection)) { 
     switch (event->response_type & ~0x80) { 
      case MY_CUST_MSG: 
        // do something 
       break; 
      default: 
       // Unknown event type, ignore it 
       debug_log("Unknown event: ", event->response_type); 
     } 
     free(event); 
    } 

auf eine Nachricht von einem sekundären Thread zu reagieren?

Antwort

1

xcb_wait_for_event() wartet auf ein Ereignis, das vom Server empfangen wird. Sie müßten eine Nachricht an dich selbst, durch den Server senden, aber ich würde einen alternativen Ansatz vorschlagen:

  1. Verwenden xcb_file_descriptor() den zugrunde liegenden Dateideskriptor für die X-Verbindung zu erhalten.

  2. Richten Sie eine interne Pipe ein, die Ihre Anwendung verwenden kann, um Nachrichten an sich selbst zwischen den Threads zu senden.

  3. Verwenden Sie xcb_poll_for_event(), die eine nicht blockierende Version von xcb_wait_for_event() ist, um eine nicht blockierende Prüfung zu implementieren, wenn ein Ereignis gelesen wurde, und wenn ja, lesen Sie es.

  4. Führen Sie eine nicht blockierende Überprüfung Ihrer internen Pipe durch, um nach internen Nachrichten von anderen Threads zu suchen.

  5. Wenn weder Schritt 3 noch 4 eine Nachricht erzeugt haben, verwenden Sie poll(), um auf das eine oder andere Ereignis zu warten.

Sie werden auch xcb_flush() verwenden müssen alle Ereignisse manuell zu spülen, und xcb_connection_has_error() für einen fatalen Fehler Verbindung zum X-Server zu überprüfen.

See the tutorial für weitere Informationen.

+0

Danke Sam das ist sehr interessant. Ich werde es versuchen und Sie wissen lassen, wie es gelaufen ist. Wenn Sie Zeit haben, zeigen Sie bitte die "Nachricht an Sie selbst, durch den Server" -Methode. – Noitidart

+0

Gibt es ein vorhandenes Ereignis, das ich mit 'xcb_send_event' verwenden kann, muss ich nur eine Zeichenfolge senden. Wie möglicherweise 'XCB_EVENT_MASK_NO_EVENT'? – Noitidart

+1

Sie können das Ereignis "ClientMessage" verwenden. Weitere Informationen finden Sie in der [X11R7-Protokollspezifikation] (https://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html#events:ClientMessage). –

Verwandte Themen