wxWidgets, Eventverarbeitung explizit auslösen



  • Hallo ProgChild,

    danke für die Antwort! das mit dem Anmelden werde ich gleich mal machen.

    Die Funktion "Poll()" befindet sich in meiner Thread-Klasse "MyClass", die wiederum von wxThread und wxEvtHandler abgeleitet ist.
    Der Aufruf wxGetApp().Dispatch() bringt mir hier leider nichts, da die App nie mitbekommt, dass der MyClass-Thread ein Event empfangen hat - weil, der MyClass-Thread das Event von einem anderen (wiederum ein eigener) Thread mittels

    m_MyClass->AddPendingEvent(doSomethingEvent)
    

    bekommt.

    ich hoffe, du konntest mir folgen?

    was ich gerade getestet habe war folgendes

    void MyClass::Poll()
    {
       for(i=0; i < X; i++)
       {
          DoSomeBlackMagic();
    
          ProcessPendingEvents(); //wurde von der wxEvtHandler-Klasse geerbt.
       }
    }
    

    Die Methode verhält sich dann genau so, wie ich es wünsche - aaaaber, in der
    wxEvtHandler::ProcessPendingEvents()-Methode wird eine Meldung ausgeworfen die wie folgt lautet:

    // this method is only called by wxApp if this handler does have
        // pending events
        wxCHECK_RET( m_pendingEvents,
                     wxT("Please call wxApp::ProcessPendingEvents() instead") );
    ...
    


  • bin jetzt registriert 🙂



  • nightmare8019 schrieb:

    bin jetzt registriert 🙂

    🙂

    Also... hab mal ein bisschen rumgesucht. Das Problem ist, dass du die Funktion auch aufrufst, wenn keine Events da sind, die bearbeitet werden könnten. Darum meckert wxWidgets.

    wxApp testet dazu die globale Variable wxPendingEvents. Da du von wxEvtHandler abgeleitet hast, sollte dir die Variable m_pendingEvents zur Verfügung stehen.

    Versuchmal, ob du eine der beiden Variablen vorher auf NULL überprüfst, obs dann klappt.

    Hab mich jetzt ne Weile durch den wxWidgets-Quellcode gewühlt. Schreib, wenns klappt 😃


  • Mod

    Ich glaube der Aufruf ist überflüssig, wenn du stattdessen ein Sleep in deine Poll Funktion einbaust, könnte es schon gehen.



  • die Sache mit Sleep habe ich bereits ausprobiert, jedoch klappt es trotzdem nicht.

    die Prüfung auf NULL habe ich auch schon versucht, jedoch ist m_pendingEvents durchgehend NULL und daher rufe ich wxEvtHandler::ProcessPendingEvents() nicht auf, da es sonst knallt.

    Die Prüfung von wxPendingEvents habe ich noch nicht ausprobiert. Bekommt wxApp denn überhaupt mit, wenn auf den Schichten über ihr ein Event versendet wird??
    ich versende benutzerdefinierte Events, das sollte aber kein Problem sein..

    ich verzweifel hier langsam 😞


  • Mod

    Evtl. ließt du dir mal das Kapitel zu Threads im wxWidgetsbuch durch.
    Das gabs mal online als PDF, müsstest du über google finden können.



  • Das Kapitel habe ich mir bereits durchgelesen, aber das hat mich auch nicht sonderlich weitergebracht 😞


  • Mod

    Könntest du mal den gesamten betroffenen Code von dir posten?



  • ok, das werde ich machen, ich denke aber, dass ich es erst morgen-Mittag schaffen werde, da ich morgen erst wieder im Büro bin.



  • nightmare8019 schrieb:

    Die Prüfung von wxPendingEvents habe ich noch nicht ausprobiert. Bekommt wxApp denn überhaupt mit, wenn auf den Schichten über ihr ein Event versendet wird??

    Wie gesagt. Hab mir ja den Quelltext von wxWidgets angeschaut. Wenn ich die Funktion AddPendingEvent richtig verstanden hab, dann wird auch wxApp informiert.

    Kannst du dir aber gerne selber anschauen: src/common/event.cpp (Zeile: 1092 bei wxWidgets 2.6.2)

    src/common/event.cpp schrieb:

    / 2) Add this event handler to list of event handlers that
    // have pending events.


Anmelden zum Antworten