我正在使用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/