关于多线程数据交互是否会因为线程休眠而卡死的问题

创作灵感:起因是工作中处理硬件传来的数据时,接收监听出现异常现象。

现象描述:两个独立的端口传输数据是有一定关联性的,在这里可以设为A端口和B端口,当A端口接收到的数据符合判断条件是,会对硬件下发某一指令,此时会接收到B端口传来的数据。理想情况下A,B端口都会有数据(数据量在每秒300-1G左右),但实际情况是当下发了数据采集命令时,A端口就没有数据到A线程了,只有当B线程运行完一次以后,才会有少量数据进入A线程,以此达到自动检测收集的效果,但不保证当B端口无数据传入后,A端口任旧有数据传入。

问题原因分析:(1)数据量过大,导致内存不够;(2)线程休眠,A端口的数据无法压入到A线程中;(3)硬件原因

排查:(1)打开任务管理器,对内存进行监控,内存占用率不超过60%,基本排除(1);(2)写了一个demo,测试线程休眠时压入数据是否会有影响,程序依旧稳定运行,数据持续压入(1,2分别是压入数据来源,然后是输出数据处理线程被压入数据的次数,之后每8s打印一次);(3)通过shark对网络端口进行抓包,若有数据源源不断从A端口传入,则证明是程序问题,若无数据传入,则证明是硬件逻辑的问题

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Qt中使用多线程进行数据交互,可以使用信号与槽机制。以下是一个简单的示例: 1. 创建一个继承自QObject的Worker类,用于在后台执行任务。 ```cpp class Worker : public QObject { Q_OBJECT public: Worker(QObject *parent = nullptr); public slots: void doWork(); // 处理任务的函数 signals: void resultReady(int result); // 任务完成后发送信号 private: // 其他私有成员 }; ``` 2. 在Worker类的doWork()函数中执行任务,并通过resultReady()信号将结果发送给主线程。 ```cpp void Worker::doWork() { int result = 0; // 执行任务 emit resultReady(result); } ``` 3. 在主线程中创建一个Worker对象,并将其移动到新的线程中。 ```cpp QThread* thread = new QThread(); // 创建新线程 Worker* worker = new Worker(); // 创建Worker对象 worker->moveToThread(thread); // 将Worker对象移动到新线程中 // 开始新线程 connect(thread, &QThread::started, worker, &Worker::doWork); ``` 4. 在主线程中连接Worker对象的resultReady()信号,以便在任务完成后更新UI界面。 ```cpp connect(worker, &Worker::resultReady, this, [](int result) { // 更新UI界面 }); ``` 5. 启动新线程并等待任务完成。 ```cpp thread->start(); // 启动新线程 thread->wait(); // 等待线程执行完成 ``` 这样,就可以使用多线程完成任务并在主线程中更新UI界面了。需要注意的是,Qt中的多线程通信需要使用信号与槽机制,以确保线程安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻瓜小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值