首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt阻塞线程和跨线程通信

Qt阻塞线程和跨线程通信
EN

Stack Overflow用户
提问于 2013-07-20 18:21:03
回答 1查看 1.3K关注 0票数 1

我想问一个关于应用程序架构的问题

将有用于提供用户交互的主GUI线程基于UDP套接字的接收线程,它将在UDP包到达时接收

  1. (希望这是blocking.
  2. Another线程,用于发送基于事件的
  3. 以及定期的UDP包。

我如何在Qt中实现这个架构,基本上我有以下问题:

  1. 对于接收线程,如何使其阻塞?

我知道readyRead()信号,我可以将它连接到某个处理数据报的插槽上,但是我该如何循环它,使这个线程永远这样做呢?

  1. In send Thread我可以从GUI线程产生一个信号,它将被发送线程接收,这里的一个插槽将在套接字上写入一些数据,但同样,当这个线程没有什么可发送时,我的意思是循环,轮询什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-20 21:37:10

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

QThread::exec()启动线程的事件循环,该循环将一直运行到调用QThread::quit()为止。这应该解决了你的“如何等待事情发生”的问题。QThread::run()的默认实现只调用exec(),所以我选择使用它。您可以在main()方法中设置所有内容,例如,为发送者线程设置:

代码语言:javascript
运行
复制
//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

发送者将仅仅是一个具有执行发送的sendMessage()插槽的QObject,一个QTimer加上用于周期性UDP包的另一个插槽,等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17761198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档