当前位置: 首页 > news >正文

淘宝作图在哪个网站上做图济南seo优化公司

淘宝作图在哪个网站上做图,济南seo优化公司,安装wordpress时选择中文语言失败,微网站建站平台解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题 目录 🔔 问题背景📄 问题代码❓ 问题描述🩺 问题分析✔ 解决方案 🔔 问题背景 在开发一个使用Qt框架的多线程应用程序时,我们遇到了一个棘手的问题&…

解决Qt多线程中fromRawData函数生成的QByteArray数据不一致问题

icon

目录

    • 🔔 问题背景
    • 📄 问题代码
    • ❓ 问题描述
    • 🩺 问题分析
    • ✔ 解决方案


🔔 问题背景

在开发一个使用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_cast<char*>(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_cast<char*>(buffer), size);QByteArray deviceData((reinterpret_cast<char*>(buffer), size);  // 创建数据的副本qDebug() << "Worker thread: " << deviceData.toHex(' ');emit dataReady(deviceData);}	    
}

这里的改动看似很小,但却解决了问题:

  • 我们使用QByteArray(const char *data, int size)构造函数来创建QByteArray
  • 这个构造函数会复制提供的数据,而不是共享它。
  • 结果是一个独立的QByteArray对象,其内容不会受到原始缓冲区变化的影响。


http://www.mmbaike.com/news/101439.html

相关文章:

  • 宝塔面板wordpress青岛百度网站排名优化
  • 宁夏建设工程质量监督站网站发新闻稿平台
  • 景安网站备案的服务码免费关键词优化排名软件
  • 施工企业信用评价等级简单网站建设优化推广
  • 牛天下网站做的怎么样营销策划品牌策划
  • 襄阳住房和城乡建设网站抖音seo搜索引擎优化
  • 手机建立网站多少钱江苏seo团队
  • 教人做辐射4mod的网站推广衣服的软文
  • 政府网站架构工具北京网站推广营销服务电话
  • 石家庄做网站网络公司百度一下你就知道移动首页
  • 建设 展示型企业网站关键词挖掘长尾词工具
  • 专用车网站建设哪家好想要网站导航推广
  • 自用电脑做网站企业培训师
  • 做网站开发需要培训吗app推广有哪些渠道
  • 织梦想把网站上传到现有网站的文件夹中测试现有网站能正常使用肇庆seo优化
  • 伊春网站优化软文街
  • 电商网站开发环境怎么写巨量引擎
  • 长宁区网站建设设计找相似图片 识别
  • 做网站销售是干什么的搜索引擎有哪些网站
  • 做美食网站的图片文娱热搜榜
  • 推广运营是什么工作标题优化怎样选关键词
  • 安阳市商祺网络有限责任公司seo技术培训茂名
  • 电商网站开发发展和前景windows优化大师在哪里
  • 有没有做ppt好看的免费网站友情链接有用吗
  • wordpress右下角郑州seo优化推广
  • 班级网站建设交换链接的方法
  • 一级a做爰片免费网站短视频教程网站申请流程
  • 做网站win7好用么抖音seo排名软件
  • 360网站卫士代备案流程360安全网址
  • 中小企业做网站推广友情链接的作用有哪些