2016-04-18 4 views
3

Ich habe einen Thread für eine Verbindung UDP.Pausieren Sie einen Thread während Timeout

Ich möchte meinen Thread während der Zeitüberschreitung pausieren (oder solange es keine neuen Frames in meinem QStack gibt, die UDP-Frames speichern).

run(){ 

    forever{ 
     QTimer *timer_nb = new QTimer(); 
     timer_nb->start(500); 

     // --- Wait for timeout or new frames in my QStack 
     //then .... 
    } 
} 

fand ich eine Funktion select(), aber ich verstehe nicht wirklich, wie es funktioniert ... Gibt es eine Alternative mit Qt?

(Sorry für mein Englisch)

+2

Bevor Sie mit Sockets arbeiten, müssen Sie die Dokumentation lesen. Sie müssen select() perfekt verstehen. –

+0

plus, select() ist eine Windows-Funktion, oder? Gibt es dann eine Alternative für Linux? –

+0

select() ist Teil der Berkeley-Sockets-Schnittstelle und daher portabel. Das Äquivalent unter Linux ist ... select() –

Antwort

1

Die Qt Mentalität ist die meiste Zeit mit Ereignissen zu arbeiten, die Qt-Ereignisschleife wird für Sie die Wartezeit/Pause machen. Obwohl select (pselect auf Linux) genau das tut, was Sie wollen ... es ist nicht der Qt Weg.

Ein Qt Weg, es zu tun beide Signale von ein neuer Rahmen empfangen und ein Timeout aufgetreten verbinden könnte. Wenn Ihre Objekte in Ihrem UDP-Thread erstellt werden, werden ihre Slots im selben Thread ausgeführt (doc about this).

Sie können in der run Funktion initialisieren und erstellen + verbinden die Signale an einigen benutzerdefinierten Slot (s), dann statt forever zu rufen Sie einfach exec() nennen (doc). Die run Funktion wird nicht zurückgeben und daher Ihren Thread nicht beenden, wird aber auf Ereignisse warten, bis Sie den Thread selbst beenden, indem Sie exit() aufrufen. Sie können es selbst aufrufen, wenn Sie erhalten haben, was Sie wollen, oder vom Hauptthread, um die Verarbeitung der Frames zu beenden.

Dann benötigen Sie einen benutzerdefinierten Steckplatz, der neue Frames verarbeitet und den QTimer zurückgesetzt, um das Timeout von 0 neu zu starten. Und schließlich einen anderen benutzerdefinierten Steckplatz für die Zeitüberschreitung oder den gleichen Steckplatz je nachdem, was Sie tun müssen.

Jetzt können Sie sehen, dass Ihr Code nicht blockiert, also könnten Sie wahrscheinlich alles direkt im Hauptthread tun, außer wenn die Datenverarbeitung lang ist.