1


アプリケーション アーキテクチャについて質問したい
1. ユーザー インタラクションを提供するためのメイン GUI スレッドがあります
2. UDP パケットが到着すると受信する UDP ソケットに基づく受信スレッド (これをブロックしたい。
3. 別のスレッドイベントベースおよび定期的な UDP パケットを送信するため. Qt でこのアーキテクチャを実装するにはどうすればよいですか?

基本的に次の質問があります:データグラムを処理するスロットに接続できますが、これをループして、このスレッドがこれを永遠に行うにはどうすればよいですか。



2.送信スレッドでは、送信スレッドによって受信されるGUIスレッドから信号を生成でき、ここのスロットはソケットにデータを書き込みますが、送信するものが何もない場合、このスレッドはどのように生き残るのでしょうか。ループ、何かをポーリングします。

4

1 に答える 1

1

セカンダリ スレッドでイベント ループを使用します。

QThread::exec()QThread::quit()が呼び出されるまで実行されるスレッドのイベントループを開始します。これで、「何かが起こるまで待つ方法」の問題が解決するはずです。QThread::run()just callsのデフォルトの実装なexec()ので、それを使用します。main()たとえば、送信者スレッドなど、メソッドですべてを設定できます。

//Create UI
MainWindow mainWindow;
mainWindow.show();

//set up sender thread and the `QObject` doing the actual work (Sender)
QThread senderThread;
Sender sender; //the object doing the actual sending
sender.moveToThread(&sender); //move sender to its thread
senderThread.start(); //starts the thread which will then enter the event loop

//connect UI to sender thread
QObject::connect(&mainWindow, SIGNAL(sendMessage(QString)), &sender, SLOT(sendMessage(QString)), Qt::QueuedConnection);

 ...

 const int ret = app.exec(); // enter main event loop

 `senderThread.quit();` //tell sender thread to quit its event loop
 `senderThread.wait();` //wait until senderThread is done

 `return ret;` // leave main

送信者は、送信を行うQObjectスロット、さらに定期的な UDP パッケージ用の別のスロットなどになります。sendMessage()QTimer

于 2013-07-20T13:37:10.390 に答える