2017-08-25 3 views
0

Ich verwende Qkeyevent, um Schlüssel A- und B-Ereignis in QT zu definieren. Wenn ich A in die Tastatur drücke, mache ich den Prozess A(), der 1 Sekunde lang dauert. Wenn ich B in die Tastatur drücke, wird B() verarbeitet. Ich möchte einen globalen Wert aktualisieren, indem ich A() verarbeite und im Prozess B() einen Wert erhalte. Allerdings Prozess A() verbringen für 1 Sekunde. Wenn ich Taste B so schnell drücke, erhalte ich den falschen Wert.Wie ich warten muss, bis Prozess A() beendet wird, wenn ich B so schnell in QT drücke.Warten auf Schlüsselereignis, bis der Prozess in QT beendet wird

int g = 3; 
A() { 
    ... 
    //cost 1 second 
    g = 4; 

} 
B() { 
    cout << g; 
} 

Zuerst schiebe ich A. Dann B.If drücken i B in 1s afer drücken B drücken, wird i g erhalten = 3.

Antwort

0

Ich weiß nicht, Ihre Implementierungsdetails, aber ich würde empfehlen wir einen Blick auf this example. Wenn Sie dies nicht gleichzeitig tun (Multithread), wird beim Eintreffen des Ereignisses "A" die Aktion A() im Ereignishandler keyPressEvent(QKeyEvent *event) aufgerufen. In diesem Fall sollte das Ereignis "B pushed" nicht verarbeitet werden, bis A() beendet ist, weil die Aktion A() die Ereignisschleife blockiert (in Ihrem Fall für 1 Sekunde). Auf diese Weise, wenn B() heißt A() ist bereits getan.

+0

Danke dir deinen Kommentar.Ich schreibe keyPressEvent in den Hauptthread.Ist ich Thread verwenden müssen? –

+0

@Moto Jack, das ist die Antwort, kein Kommentar :) Wenn sichergestellt wird, dass 'A()' beendet ist, wenn 'B()' aufgerufen wird, gibt es die Garantie, dass die Variable 'g' bereits geändert wurde. – WindyFields

+0

Vielen Dank. Ich werde versuchen, Thread –

Verwandte Themen