2016-04-18 12 views
3

私は接続UDPのスレッドを持っています。タイムアウト中にスレッドを一時停止

タイムアウト中にスレッドを一時停止したい(またはUDPフレームを格納するQStackに新しいフレームがない間に)。

run(){ 

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

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

はQtを持つ代替があります...私は()関数は、セレクト見つけましたが、私は実際にそれがどのように動作するか理解していませんか?

(私の英語のため申し訳ありませんが)

+2

ソケットを使用する前に、ドキュメントを読む必要があります。あなたはselect()を完全に理解する必要があります。 –

+0

さらに、select()はWindows関数です。それからLinuxのための代替手段はありますか? –

+0

select()はバークレーソケットインタフェースの一部であり、移植性があります。 Linuxの等価物は... select() –

答えて

1

のQtの考え方は、イベントで動作するようにほとんどの時間で、Qtのイベントループはあなたのために待機/一時停止を行います。 select(Linux上ではpselect)は、あなたが望むものとまったく同じですが... Qtの方法ではありません。それはタイムアウトが発生した新しいフレームがと受信の両方の信号に接続することであろうことの

AのQt方法。オブジェクトがUDPスレッドで作成されている場合、そのスレッドは同じスレッド(doc about this)で実行されます。

あなたはちょうどexec()doc)を呼び出す代わりにforeverを呼び出すのでは、その後、run機能に初期化し、いくつかのカスタムスロット(複数可)に信号を接続する+作成することができます。 run関数は返されずスレッドを終了しませんが、exit()を呼び出してスレッドを終了するまでイベントを待機します。あなたはあなたが望むものを受け取ったときにそれを自分で呼び出すことができます。メインスレッドからは、ある時点でフレームの処理を止めるだけです。

次に、新しいフレームを処理し、タイムアウトを0から再開するようにQTimerをリセットするカスタムスロットが必要です。タイムアウトを処理する別のカスタムスロット、または発生時に何をする必要があるかに応じて同じスロット。

コードがブロックされていないことがわかりました。データ処理が長い場合を除いて、メインスレッドで直接このすべてを実行できます。

関連する問題