auf event warten(mausklick)



  • Hallo,

    ich bin gerade dabei ein Mühlespiel zu programmieren mit Grafischer Oberfläche von WXFormBuilder erstellt.
    Nun hab ich das Problem das ich solange "warten" muss bis der aktuelle Spieler auf eine Position klickt, also warte bis ein Event meldet. Wie realsisiert man soetwas am besten ohne CPU ressourcen zu verschwenden.

    gruß Stefan



  • Hallo Stefan,

    wie "man" sowas macht, weiß ich nicht genau - ich mache es aber ungefähr so (ohne Anspruch aud Schönheit und Abwesenheit von Schreibfehlern):

    static bool waiting = false;
    
    static void DoEvents()
    {
       while (wxTheApp->Pending())
          wxTheApp->Dispatch();
       wxTheApp->ProcessIdle();
       Sleep(0);
    }
    
    void MyWindow::OnMouseClick(wxEvent& evt)
    {
     ...
       waiting = false;
     // machwas
    }
    
    void MyWindow::myWorkerFunc()
    {
       while(waiting) DoEvents();
       // machwas
       waiting = true;
    }
    

    Zu erklären ist evtl das DoEvents():

    Hier werden einfach alle gerade anstehenden Ereignisse (solange welche da sind) verarbeitet und anschließend gibt es vorsichtshalber noch einen ProcessIdle-Aufruf, um UpdateUI-Handler und solchen Kram drankommen zu lassen. Das Sleep(0) gibt einfach den aktuellen Thread frei damit der Prozessor inzwischen sinnvollere Dinge tun kann.

    Wer ordentlich ist, baut natürlich außerdem die static-Dinger mit in die Klasse ein.

    Viele Grüße
    Erik



  • Ich mache es immer mit wxEvtHandler::Connect():

    bool MyApp::OnInit()
    {
        //...
        MyCell->Connect(wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(MyApp::CellClicked);
    }
    
    void MyApp::CellClicked(wxCommandEvent &evt)
    {
        //machwas
    }
    

Anmelden zum Antworten