QT 在多线程中使用QMap因迭代器失效而导致的“段错误,核心已转储”问题

在实现通过http请求管理线程任务的过程中,遇到一个问题:当收到‘结束报文’时,程序出现‘段错误,核心已转储’。原因在于多线程环境下遍历QMap时使用了迭代器,导致迭代器失效。解决方案是使用QVector存储QMap的keys,遍历时顺序访问QVector并根据key获取QMap中的元素,避免迭代器失效问题。
摘要由CSDN通过智能技术生成

1.功能和问题描述

   功能:通过http请求实现任务的启动和关闭功能,每收到一个“开始报文”建一个线程任务,收到对应的“结束报文”的时候停止该任务。

  问题: 收到“结束报文”之后,程序出现:“段错误,核心已转储存”问题,程序崩溃

2.代码展示与问题分析

video_test.h

#ifndef VIDEO_TEST_H
#define VIDEO_TEST_H
#include "video_read_thread.h"
class video_test : public InterfaceAlg
{
    Q_OBJECT
public:
    explicit video_test(QObject * parent =0);
    ~video_test();
    //此函数用来接收开始和结束报文    
    virtual bool DetectVideo( QString input_param, QString &output_param);
private:
   //其他类成员
   .......


    //Qmap容器,用来存储任务线程,并和任务id对应起来
    QMap<QString,video_read_thread*> task_Thread_map;
    //分析一帧图片
    bool alg_frame(cv::Mat & frame,QString timestamp,QString camera_name,QString camera_code);

protected:
    virtual void run();


};
#endif // VIDEO_TEST_H



video_test.cpp


#pragma execution_character_s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值