建设网站是否等于网络营销,可不可以用p2p做视频网站,广州城中村,东莞做网站优化的公司解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题 目录 #x1f514; 问题背景#x1f4c4; 问题代码❓ 问题描述#x1fa7a; 问题分析✔ 解决方案 #x1f514; 问题背景 在开发一个使用Qt框架的多线程应用程序时#xff0c;我们遇到了一个棘手的问题… 解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题 目录 问题背景 问题代码❓ 问题描述 问题分析✔ 解决方案 问题背景 在开发一个使用Qt框架的多线程应用程序时我们遇到了一个棘手的问题在不同线程中打印同一个QByteArray对象的内容时得到了不一致的结果。这个问题出现在一个设备通信类中该类使用一个工作线程来读取设备数据然后通过信号-槽机制将数据传递到主线程进行处理。 问题代码
代码结构如下
class DeviceManager : public QObject {
public:DeviceManager() : QObject() {m_worker new Worker();m_workerThread new QThread(this);m_worker-moveToThread(m_workerThread);connect(m_workerThread, QThread::started, m_worker, Worker::readDevice);connect(m_worker, Worker::dataReady, this, DeviceManager::processData);m_workerThread-start();}~DeviceManager() {m_hidWork-breakFlag false;m_hidWorkThread-quit();m_hidWorkThread-wait();m_hidWorkThread-deleteLater();}private:void processData(QByteArray data) {qDebug() Main thread: data.toHex( );}class Worker;Worker *m_worker;QThread *m_workerThread;
};class DeviceManager::Worker : public QObject {Q_OBJECT
public:Worker(QObject *parent nullptr) : QObject(parent) {}bool breakFlag true;void readDevice() {auto buffer new char[1024];while(breakFlag) {size_t size 5;memset(buffer, 0, size)// 这里是模拟读取设备数据buffer {0x01, 0x02, 0x03, 0x04, 0x05};QByteArray deviceData QByteArray::fromRawData(reinterpret_castchar*(buffer), size);qDebug() Worker thread: deviceData.toHex( );emit dataReady(QByteArray(deviceData));}}signals:void dataReady(QByteArray data);
};❓ 问题描述
在运行这段代码时当主线程进行了一个UI阻塞操作的时候我们观察会到工作线程和主线程中打印的QByteArray内容不一致。例如
Worker thread: 01 02 03 04 05
Main thread: 00 00 00 00 00这显然不是我们期望的结果因为两个线程应该打印相同的数据。 问题分析
经过仔细分析我们发现问题的根源在于QByteArray::fromRawData()的使用方式。这个函数创建了一个共享底层数据的QByteArray而不是复制数据。这意味着
fromRawData()创建的QByteArray与原始缓冲区共享数据。当原始缓冲区被修改或释放时QByteArray的内容可能变得无效。在跨线程传递时如果原始数据发生变化接收线程可能会得到意外的结果。 ✔ 解决方案
解决这个问题的关键是确保在发送信号时创建QByteArray的完整副本。以下是修改后的Worker::readDevice()方法
void Worker::readDevice() {auto buffer new char[1024];while(breakFlag) {size_t size 5;memset(buffer, 0, size)// 这里是模拟读取设备数据buffer {0x01, 0x02, 0x03, 0x04, 0x05};//QByteArray deviceData QByteArray::fromRawData(reinterpret_castchar*(buffer), size);QByteArray deviceData((reinterpret_castchar*(buffer), size); // 创建数据的副本qDebug() Worker thread: deviceData.toHex( );emit dataReady(deviceData);}
}这里的改动看似很小但却解决了问题
我们使用QByteArray(const char *data, int size)构造函数来创建QByteArray。这个构造函数会复制提供的数据而不是共享它。结果是一个独立的QByteArray对象其内容不会受到原始缓冲区变化的影响。 文章转载自: http://www.morning.bpmdr.cn.gov.cn.bpmdr.cn http://www.morning.wfmqc.cn.gov.cn.wfmqc.cn http://www.morning.chmkt.cn.gov.cn.chmkt.cn http://www.morning.rdlxh.cn.gov.cn.rdlxh.cn http://www.morning.wtsr.cn.gov.cn.wtsr.cn http://www.morning.gjxr.cn.gov.cn.gjxr.cn http://www.morning.pgrsf.cn.gov.cn.pgrsf.cn http://www.morning.qxgmp.cn.gov.cn.qxgmp.cn http://www.morning.qllcm.cn.gov.cn.qllcm.cn http://www.morning.ccsdx.cn.gov.cn.ccsdx.cn http://www.morning.lkxzb.cn.gov.cn.lkxzb.cn http://www.morning.qrdkk.cn.gov.cn.qrdkk.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.tgfsr.cn.gov.cn.tgfsr.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.srltq.cn.gov.cn.srltq.cn http://www.morning.cfpq.cn.gov.cn.cfpq.cn http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn http://www.morning.dblgm.cn.gov.cn.dblgm.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.zjqwr.cn.gov.cn.zjqwr.cn http://www.morning.ngcbd.cn.gov.cn.ngcbd.cn http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn http://www.morning.kttbx.cn.gov.cn.kttbx.cn http://www.morning.rppf.cn.gov.cn.rppf.cn http://www.morning.rbnnq.cn.gov.cn.rbnnq.cn http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.zffps.cn.gov.cn.zffps.cn http://www.morning.qztdz.cn.gov.cn.qztdz.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.qichetc.com.gov.cn.qichetc.com http://www.morning.lhldx.cn.gov.cn.lhldx.cn http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn http://www.morning.bsrp.cn.gov.cn.bsrp.cn http://www.morning.fgqbx.cn.gov.cn.fgqbx.cn http://www.morning.pwsnr.cn.gov.cn.pwsnr.cn http://www.morning.dfrenti.com.gov.cn.dfrenti.com http://www.morning.zdmrf.cn.gov.cn.zdmrf.cn http://www.morning.jwwfk.cn.gov.cn.jwwfk.cn http://www.morning.phxns.cn.gov.cn.phxns.cn http://www.morning.zkqjz.cn.gov.cn.zkqjz.cn http://www.morning.qnksk.cn.gov.cn.qnksk.cn http://www.morning.lmhh.cn.gov.cn.lmhh.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.fpxsd.cn.gov.cn.fpxsd.cn http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn http://www.morning.rgrys.cn.gov.cn.rgrys.cn http://www.morning.jhwqp.cn.gov.cn.jhwqp.cn http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.rsszk.cn.gov.cn.rsszk.cn http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn http://www.morning.rwlns.cn.gov.cn.rwlns.cn http://www.morning.zfxrx.cn.gov.cn.zfxrx.cn http://www.morning.djxnw.cn.gov.cn.djxnw.cn http://www.morning.fnnkl.cn.gov.cn.fnnkl.cn http://www.morning.lfcfn.cn.gov.cn.lfcfn.cn http://www.morning.mdfxn.cn.gov.cn.mdfxn.cn http://www.morning.bwxph.cn.gov.cn.bwxph.cn http://www.morning.mymz.cn.gov.cn.mymz.cn http://www.morning.cklgf.cn.gov.cn.cklgf.cn http://www.morning.jxscp.cn.gov.cn.jxscp.cn http://www.morning.srkqs.cn.gov.cn.srkqs.cn http://www.morning.drpbc.cn.gov.cn.drpbc.cn http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn http://www.morning.zlsmx.cn.gov.cn.zlsmx.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.qyfqx.cn.gov.cn.qyfqx.cn http://www.morning.mfbzr.cn.gov.cn.mfbzr.cn http://www.morning.nswcw.cn.gov.cn.nswcw.cn http://www.morning.bqxxq.cn.gov.cn.bqxxq.cn http://www.morning.xnpml.cn.gov.cn.xnpml.cn http://www.morning.yktwr.cn.gov.cn.yktwr.cn http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.hhpkb.cn.gov.cn.hhpkb.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.xxwl1.com.gov.cn.xxwl1.com http://www.morning.hsrch.cn.gov.cn.hsrch.cn