2017-02-20 3 views
0

Qt doc:Qt - Führt ein QTimer :: timeout() Signal zu einem QEvent?

Wenn keine Ereignisschleife ausgeführt wird, werden Ereignisse, die nicht auf das Objekt geliefert werden. Wenn Sie beispielsweise ein QTimer-Objekt in einem Thread erstellen, aber niemals exec() aufrufen, gibt der QTimer niemals sein timeout() -Signal aus. Der Aufruf von deleteLater() funktioniert auch nicht. (Gelten diese Einschränkungen für die Haupt Thread als auch.)

dieses void QTimer::timeout() dieses Signal bedeutet aber auch eine QEvent ausstellen?
Wenn ja, wo sagt das Qt doc das?

+0

Siehe: http://doc.qt.io/qt-5/qtimerevent.html – MrEricSir

+0

'QTimer' und' QTimerEvent' sind zwei verschiedene Möglichkeiten, Timer in Qt zu verwenden. Weitere Informationen finden Sie in der [Qt doc] (http://doc.qt.io/qt-5/qtimer.html#alternatives-to-qtimer). 'QTimer' verwendet Signal/Slot-Kommunikation, während' QTimerEvent' (erstellt von 'QObject :: startTimer' und behandelt von' QObject :: timerEvent() 'oder und Ereignisfilter) sind Ereignisse. Beide erfordern jedoch eine Ereignisschleife im aktuellen Thread. – cbuchart

Antwort

0

wo sagt das Qt doc das?

Nirgendwo, weil es für den Benutzer von QTimer keine Rolle spielen sollte. Das Timer-Ereignis ist ein Implementierungsdetail. Es wird an das Timer-Objekt selbst geliefert, so dass Sie wirklich aus dem Weg gehen müssen, um es abzufangen. Hier ist, wie QTimer Werke:

class QTimer : public QObject { 
    Q_TIMER 
    QBasicTimer m_timer; 
protected: 
    void timerEvent(QTimerEvent * ev) override { 
    if (ev->timerId() == m_timer.timerId()) 
     emit timeout(); 
    } 
    /*...*/ 
}; 

Wenn man darüber nachdenkt, gibt es keine Möglichkeit, irgendwelche Signale zu emittieren, ohne den Code ausgeführt wird, der die Signale aussendet, und der einzige Weg, sicher einen solchen Code auszuführen, um Code Dinge asynchron ist aussendet für "run-to-completion" -Brocken, die bei jeder Gelegenheit die Kontrolle an die Ereignisschleife abgeben. Die Ereignisschleife wird von der Plattform benachrichtigt, dass ein Zeitgeber abgelaufen ist, und gibt dann ein Signal aus. Sie würden in große Schwierigkeiten geraten, wenn Qt Signale wie Timer-Timeouts von aufdringlichen asynchronen Rückrufen wie Unix-Signalen ausgibt: Lesen Sie nur, wie wenige Dinge Sie in einem Signal-Handler tun können - es wäre nichts anderes als ein Interrupt-Handler.

Verwandte Themen