繁体   English   中英

如何并行运行Qt UI和Linux消息队列接收线程?

[英]How to run Qt UI and Linux message queue reception thread in parellel?

我正在使用 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_timer超出范围, poll_function()将停止调用。 在你的实际代码中,你应该使用一个QTimer ,只要你需要它就可以一直存活。 应该是QApplication子类的数据成员。

如果poll_function()阻塞,那么这种方法将不起作用,因为它会阻塞 UI。 所以你应该确保告诉msgrcv()不要阻塞。 手册页

如果没有请求类型的消息可用并且 msgflg 中没有指定 IPC_NOWAIT,则调用进程被阻塞

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

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

poll_timer.setInterval(500);

这将每 500 毫秒调用一次您的轮询函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM