使用事件循环和QSocketNotifiers线程观察使用线程

问题描述:

我昨天问这个问题,因为我没有收到任何数据,但奇怪的是,当我在析构函数中使用等待时,我开始从QSocketNotifier收到通知。问题的其余部分是相同的。有人能提出一些建议吗 我已经创建了一个示例应用程序,从单独的线程开始读取和处理来自串行端口的数据。 QSocketNotifier用于检测数据是否到达串口。我在线程的运行函数中使用exec()语句启动事件循环。但是,只有在套接字通知程序运行后才运行应用程序,串行端口激活的信号永远不会生成。而且一旦生成它就会非常快速地生成,并不等同于发送设备的帧速率。使用事件循环和QSocketNotifiers线程观察使用线程

下面是用于串行通信的线程的简短代码示例:

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 
} 

注:克拉斯是一个线程和GUI线程的成员,并在GUI线程c的实例化” TOR。定期使用来自klass线程的数据更新其窗口小部件。

任何人都可以提出问题是什么?之前有人做过这个。

+0

您似乎错过了对问题的描述。不要以为人们会阅读你以前的问题(或者想要)。更好地完成这个问题 – 2009-06-25 05:09:30

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