使用带有事件循环和 QSocketNotifiers 的线程的问题串行端口监视

Posted

技术标签:

【中文标题】使用带有事件循环和 QSocketNotifiers 的线程的问题串行端口监视【英文标题】:Issues Serial Port Watch using threads with an event loop and QSocketNotifiers 【发布时间】:2009-06-25 04:58:38 【问题描述】:

我昨天问了这个问题,因为我没有收到任何数据,但奇怪的是,当我在析构函数中使用 wait 时,我开始收到来自 QSocketNotifier 的通知。剩下的问题是一样的。有人可以提出一些建议吗? 我创建了一个示例应用程序,从中启动单独的线程来读取和处理来自串行端口的数据。 QSocketNotifier用于检测串口是否有数据到达。我在线程的运行函数中使用exec() 语句启动事件循环。但是,当套接字通知器工作后才运行应用程序时,永远不会生成串行端口激活的信号。而且一旦生成,生成速度非常快,不等于发送设备的帧率。

以下是串行通信器线程的简短代码示例:

SerialPortWatchOne.cpp

//constructor
klass::klass()

//setport configuration
//miscellaneous initialization
QSocketNotifier* notifier = new QSocketNotifier(mPort->GetFileDescriptor, QSocketNotifier::Read,this);
connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadAndProcessData()));


void klass::run()

exec();  //this starts an event loop where by Qt signal handling is enabled


void klass::ReadAndProcessData()

      FlushBuf();      
      int bytes_read=mPort->ReadPort(mBuf,1000);
      if(bytes_read>0)
         //Process data


~klass::klass()

//desctruction code;
wait();  //so that thread cleanly releases all resources before exit

注意:klass 是一个线程,也是 GUI 线程的成员,在 GUI 线程 c'tor 中实例化。 GUI 会定期使用来自 klass 线程的数据更新其小部件。

谁能提出问题是什么?以前有人这样做过吗?

【问题讨论】:

您似乎缺少对问题的描述。不要假设人们会阅读您之前的问题(或希望阅读)。最好让这个问题完整 这是我昨天问的确切问题,只有前几行是我今天完成的工作的结果。如果还有什么不清楚的就指出来。我已经说得很清楚了 【参考方案1】:

唯一想到的是您正在使用QSocketNotifier * socketNotifier,而socketNotifier->thread() 线程中没有运行事件循环。如果没有事件循环正在运行,您将不会得到任何事件处理。没有事件处理意味着没有来自QSocketNotifier 的信号。但是,如果您使用的是单独的线程,您可能还是希望使用阻塞 I/O 调用。

【讨论】:

以上是关于使用带有事件循环和 QSocketNotifiers 的线程的问题串行端口监视的主要内容,如果未能解决你的问题,请参考以下文章

带有 Qt 5.12 QSocketNotifier 的 ZeroMQ 只触发一次

QSocketNotifier 如何通知我管道已准备好读取?

QSocketNotifier - 如何使用它来观看文件? - linux

QSocketNotifier 与 nanomsg

如何获得一个循环来加载带有事件监听器的影片剪辑

WSO2工具(eclipse)错误未处理的事件循环异常:带有groovy脚本的脚本调解器