大家好:
之前做过一个
串口数据接收并且绘图的东西,但是发现当串口不停发送数据时,界面会卡死不响应,于是我想把串口接收数据放到QThread中,解析完数据后传给主线程UI绘图.
但是现在Qthread中要连接槽函数,我的要在run()中初始化,在定时器的槽函数中读取数据,这样实际读取数据的那个槽函数依旧是在主
线程中,大数据量时依旧卡死...
不知道各位大牛碰到类似的
问题都是怎么解决的,请教.
贴上新开的线程代码
- //.h
- #ifndef SERIALPORTTHREAD_H
- #define SERIALPORTTHREAD_H
- #include <QWidget>
- #include <QTimer>
- #include <QDebug>
- #include "qextserialport.h"
- /*POSIX CODE*/
- #ifdef _TTY_POSIX_
- #define QextBaseType Posix_QextSerialPort
- /*MS WINDOWS CODE*/
- #else
- #define QextBaseType Win_QextSerialPort
- #endif
- //========================================
- class SerialPortThread: public QThread
- {
- Q_OBJECT
- public:
- SerialPortThread();
- ~SerialPortThread();
- void run();
- QextSerialPort SerialPort;
- private slots:
- void readComData();
- };
- #endif // SERIALPORTTHREAD_H
- //.cpp
- #include "serialportthread.h"
- SerialPortThread::SerialPortThread()
- {
- }
- SerialPortThread::~SerialPortThread()
- {
- qDebug()<<"~SerialPortThread()";
- }
- void SerialPortThread::readComData()//实际接收函数没有在run()里,没进线程
- {
- QByteArray temp = SerialPort.readAll();
- //if(temp.isEmpty())return;
- qDebug()<<"In SerialPortThread::readComData()"<<temp.toHex();
- }
- void SerialPortThread::run(){
- QTimer readComTimer;
- QTimer transmitComTimer;
- bool isOpened = false;
- //for SerialPort
- SerialPort.setQueryMode(QextSerialPort::Polling);
- readComTimer.setInterval(1500);
- transmitComTimer.setInterval(1500);
- //for Init com
- SerialPort.setPortName("COM7");
- SerialPort.setBaudRate(BAUD115200);
- SerialPort.setDataBits(DATA_8);
- SerialPort.setParity(PAR_NONE);
- SerialPort.setStopBits(STOP_1);
- SerialPort.setFlowControl(FLOW_OFF);
- SerialPort.setTimeout(200);
- SerialPort.open(QIODevice::ReadWrite);
- isOpened = SerialPort.isOpen();
- qDebug()<<"isOpen = "<<isOpened;
- connect(&readComTimer,SIGNAL(timeout()),this,SLOT(readComData()));
- readComTimer.start();
- this->exec();
- }