c++ - 如何并行运行Qt GUI和Linux消息队列接收线程?

标签 c++ linux qt qt5

我正在使用CPP使用QTCreator开发UI。我的要求是运行UI,并且需要使用msgrcv()函数连续轮询linux消息队列,是否有任何数据进入队列。我创建了一个线程来连续监视接收队列消息。在启动和运行上述线程时,UI卡住了。并行运行线程和UI的任何解决方案?

最佳答案

不看代码就无法分辨。但是,如果轮询操作是非阻塞的,则实际上不需要线程。您可以注册一段代码,使Qt的事件循环将在每次UI事件循环迭代中运行。您可以使用0ms QTimer进行此操作:

void poll_function();

// ...

QTimer poll_timer;
QObject::connect(&poll_timer, &QTimer::timeout, poll_function);
poll_timer.start();

当然,在上面的示例代码中,一旦poll_function()超出范围,poll_timer将停止被调用。在您的真实代码中,您应该使用一个QTimer,它可以一直保持有效。应该是QApplication子类的数据成员。

但是,如果poll_function()阻止,则此方法将不起作用,因为它将阻止UI。因此,您应该确保告诉msgrcv()不要阻止。从man page:

If no message of the requested type is available and IPC_NOWAIT isn't specified in msgflg, the calling process is blocked



因此,请确保在调用IPC_NOWAIT时在msgflg标志中包括msgrcv()

如果对每个UI事件循环迭代进行轮询都开销太大,那么可以改为设置正常的超时间隔(以毫秒为单位):
poll_timer.setInterval(500);

这将每500毫秒调用一次轮询功能。

关于c++ - 如何并行运行Qt GUI和Linux消息队列接收线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60501408/

相关文章:

linux - 创建包含内容的文件,其中内容有新行

linux - 将 1000 字节转换为 1024 字节

linux - 批量将字符串附加到数千个 CSV 的第 1 列 (Linux)

qt - 何时使用 QString{...}、tr(...) 和 +=/append?

c++ - 输入到 stringstream 并在单个语句中转换为字符串。没有辅助类可以吗?

c++ - Lambda 作为默认参数失败

对象的 C++ vector 和对析构函数的过度调用?

qt - 如何在 Qt 对话框关闭时终止异步函数

Qt5.6 QML,为什么垃圾回收后动态模型会被销毁?

c++ - 如何删除二维double数组