1


我想问一个关于应用程序架构的问题
1. 将有用于提供用户交互的主 GUI 线程
2. 基于 UDP 套接字的接收线程将在 UDP 数据包到达时接收它们(希望这被阻塞
。3. 另一个线程用于发送基于事件以及周期性 UDP 数据包。

我如何在 Qt 中实现这个架构,基本上我有以下问题:
1. 对于接收线程,我如何让它阻塞?
我知道 readyRead() 信号,我可以将它连接到将处理数据报的某个插槽,但是我如何循环它以便该线程永远执行此操作。

2. 在发送线程中,我可以从 GUI 线程生成一个信号,该信号将由发送线程接收,并且这里的一个插槽将在套接字上写入一些数据,但是当它没有要发送的内容时,这个线程将如何生存,我的意思是循环,轮询什么?

4

1 回答 1

1

在辅助线程中使用事件循环。

QThread::exec()启动线程的事件循环,该循环将一直运行,直到QThread::quit()被调用。那应该可以解决您的“如何等到事情发生”的问题。QThread::run()只是调用的默认实现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 回答