使用带有事件循环和 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 如何通知我管道已准备好读取?