记一次Qt串口的线程问题,自己构造的一个串口类如下:
把这个类 this->moveToThread(thread);
之后发现会程序会有崩溃等问题。
我个人猜测是 线程里用到了m_serial_port->readAll();
主线程里又用到了m_serial_port并发出信号,当同一时间主线程和副线程共同使用了m_serial_port这块内存就会引发错误。
解决方法如下:方法一:将m_serial_port也放入该线程
方法二:加线程访问锁
解决的代码就不放出来了 自己写去
class RXBluetoothSerialPort : public RXSerialport
{
Q_OBJECT
public:
RXBluetoothSerialPort();
~RXBluetoothSerialPort();
void SetTotalBytes(int value);//外部设置统计的总的byte数字
void Init(); //初始化参数
private:
int total_Byte;//统计接受到的总的Byte
QByteArray history_aray;//缓存字节
bool receiving_pressure_data; //表示正在接受压力数据中
QThread *thread;//将该对象放入线程,该类的槽函数执行在线程里
//如果头在缓存字节串里则为true 否则为false
//优先级 instruction_head_exist>data_head_exist
//这两个头标记互斥 不存在值一样的情况
bool data_head_exist; //接受到的数据头
bool instruction_head_exist;//指令头部
//校验位 求和验证
bool SumVerification(QByteArray byte_array);
void InitBufData(); //清空缓存 初始化头标记
signals:
void SendPressureData(QList<RXSerialPortNamespace::PressureData>);
void SendPressureData(RXSerialPortNamespace::PressureData);
void ShowInstructionData(QByteArray bytes);
void ShowReceiveHexData(QString);
void SendPressureData(double pressure_value, double heart_rate);
void ShowConsoleData(QString);
//可读性考虑,不用参数来判定,直接4个信号
void ShowPressureInfo(int,RXSerialPortNamespace::BloodPressureType); //发送舒张压
void ErrorPort();//错误情况串口关闭时发出该信号
public slots:
void WriteData(QString);
//写指令数据
void WriteData(RXSerialPortNamespace::InstructionToBleType);
//写连接第几个Mac地址
void WriteData(int mac_num);
protected slots:
void ReadData();
};
2019.7.23
//在线程对象里构造函数new的子变量 是属于主线程的 在线程start触发的函数里new的是属于子线程的
所以说尽量还是new在线程里 不影响释放
2019.12.25
如上可以将QSerialPort封装的类放入线程 打开串口 关闭 设置等操作走主线程 接收处理数据这种耗时操作可以放在其他线程中去。如果一直发 QSerialPort不readall的话 可能这个对象的缓存区会溢出 需要及时flush