アプリケーション アーキテクチャについて質問したい
1. ユーザー インタラクションを提供するためのメイン GUI スレッドがあります
2. UDP パケットが到着すると受信する UDP ソケットに基づく受信スレッド (これをブロックしたい。
3. 別のスレッドイベントベースおよび定期的な UDP パケットを送信するため. Qt でこのアーキテクチャを実装するにはどうすればよいですか?
基本的に次の質問があります:データグラムを処理するスロットに接続できますが、これをループして、このスレッドがこれを永遠に行うにはどうすればよいですか。
2.送信スレッドでは、送信スレッドによって受信されるGUIスレッドから信号を生成でき、ここのスロットはソケットにデータを書き込みますが、送信するものが何もない場合、このスレッドはどのように生き残るのでしょうか。ループ、何かをポーリングします。
質問する
1323 次
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 に答える