UpdateData在线程中出错的解决办法 .

本文详细介绍了在MFC环境下,如何解决线程中使用UpdateData导致的错误。通过定义自定义消息和消息映射,将UpdateData调用替换为SendMessage,实现了在多线程环境下的数据更新。此方法适用于需要在多线程程序中实时更新UI场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

UpdateData在线程中出错的解决办法

2009年12月3日 虚幻 发表评论 阅读评论

最近在写一个监视程序,需要定时查看共享内存中的各个值。于是在MFC中,首先开了一个线程,用的是boost的timer,每隔1秒读取共享内存中的值,另外一个线程通过调用UpdateData(FALSE)将值显示在界面上。但是在我调试的时候发现,UpdateData一直报错。

 

最后查了下,还是线程的问题,在线程中,不能直接用UpdateData来更新数值。解决的办法,应该自己定义一个消息,将UpdateData(FALSE)替换为SendMessage(WM_UPDATEDATA, FALSE)就可以了。具体的做法如下:

首先,定义消息和回调函数

加入函数映射

  1. #define  WM_UPDATEDATA  WM_USER + 1   
  2. LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);  

 

  1. ON_MESSAGE(WM_UPDATEDATA, OnUpdateData)  

最后,实现回调函数

  1. LRESULT CXXXDlg::OnUpdateData(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     UpdateData(wParam);  
  4.     return 0;  
  5. }  

原来是设备一次发一条数据,现在设备一次发n条数据(这次发和上次发的同个设备的数据顺序一致123),接收和存储的代码怎么修改, 用 QMap <int,QList<TrackTime>> TrackTimeMap结构存不同设备的n条数据可以吗? class1: .h: uint8_t TrackingDataStateBuf[2]; uint64_t TrackingTimeBuf[3]; struct TrackTime { uint64_t initTrackTime; uint64_t lastTrackTime; uint64_t totalTime = 0; bool isActive = false; bool hasInit = false; }; QMap <int,TrackTime> TrackTimeMap; uint TrackingDataCount; .cpp: //更新并存储时间等数据,dev是设备号 bool class1::Updatedata(unsigned char *frame,uint recvsize,int devnum) { uchar targetcount=0; uint8_t s1 = frame[1]; uint8_t trackFalg = frame[2]; uint64_t nowTime = 0; uint64_t relativeTime = 0; //考虑失去track TrackTime& trackData = TrackTimeMap[devnum]; if(!trackData.hasInit && trackFalg==1) { trackData.initTrackTime = nowTime; trackData.lastTrackTime = nowTime; trackData.isActive = true; trackData.hasInit = true; } if(trackData.isActive && trackData.hasInit) { uint64_t differ = nowTime- trackData.lastTrackTime; if(differ>=0) { trackData.totalTime+=differ; } trackData.lastTrackTime = nowTime; if(trackFalg==0) { trackData.isActive = false; } } else if(!trackData.isActive && trackFalg==1 && trackData.hasInit) { trackData.lastTrackTime = nowTime; trackData.isActive = true; } relativeTime = 123; TrackingDataStateBuf[0] = s1; TrackingDataStateBuf[1] = trackFalg; TrackingTimeBuf[0] = trackData.initTrackTime; TrackingTimeBuf[1] = trackData.totalTime; TrackingTimeBuf[2] = relativeTime; }
最新发布
08-06
<think>我们面临的问题:原来设备一次发一条数据,现在设备一次发n条数据(同个设备的数据顺序一致,例如123)。我们需要修改接收和存储的代码。 当前代码结构: - 使用了一个QMap<int, TrackTime> TrackTimeMap来存储每个设备(devnum为键)的TrackTime结构。 - TrackTime结构用于记录每个设备的初始时间、最后时间、总时间、是否激活、是否初始化等状态。 修改点: - 原来一次处理一个设备的一条数据,现在一次接收一个设备的n条数据(假设n>=1)。 - 我们需要为每个设备的每条数据都进行类似原来的处理,并存储n条数据对应的状态和时间信息。 当前存储结构的问题: - 当前代码中,每个设备在TrackTimeMap中只有一个TrackTime结构,只能存储一个状态(即最后一次处理后的状态)。如果一次来n条数据,我们需要按顺序处理每一条,并更新状态,同时需要记录每条数据对应的状态和时间(因为我们需要存储n条数据的结果,而不仅仅是最后一条)。 - 另外,原来代码中使用了三个全局数组(TrackingDataStateBuf和TrackingTimeBuf)来存储最后一次处理的结果,显然这只能存储一条数据的结果。现在需要存储n条,所以这些数组需要改为能够存储每个设备的n条数据。 解决方案: 1. 修改数据结构:将每个设备的TrackTime改为能够记录每次数据的状态,并且需要存储每次处理后的结果(而不仅仅是最后一次的状态)。 2. 对于每个设备,我们可能需要一个列表来存储每次处理后的状态(包括TrackingDataState和TrackingTime)。同时,TrackTime结构本身是用于记录设备的时间状态(持续跟踪状态),所以这个状态是连续的,不能为每条数据独立(因为每条数据是连续到达的,状态是累积的)。但是,我们需要为每条数据记录当时的状态(比如每条数据对应的relativeTime,以及当时的总时间totalTime等)。 分析: - 设备发送n条数据,这些数据是连续的,所以我们需要按顺序处理每一条,每处理一条都会更新设备的状态(TrackTime结构)。 - 同时,我们需要记录每条数据对应的状态(比如处理该条数据时的relativeTime,以及该条数据对应的其他状态)。注意:relativeTime在原来代码中是计算出来的,但这里我们可能需要对每条数据都计算一个relativeTime(相对于该设备初始时间的时间差?)。 具体修改: 建议数据结构: - 保留QMap<int, TrackTime> TrackTimeMap,用于记录每个设备的当前状态(即处理完最后一条数据后的状态)。 - 新增两个数据结构来存储每个设备的n条数据的结果: QMap<int, QList<StateData>> TrackDataMap; // 每个设备对应一个StateData列表,存储每条数据的状态 - 其中StateData结构可以定义为: struct StateData { uint8_t s1; // 对应原来的TrackingDataStateBuf[0] uint8_t trackFlag; // 对应原来的TrackingDataStateBuf[1] uint64_t initTrackTime; // 注意:这个对于同一个设备的多条数据来说,初始时间是一样的(即第一条激活的时间) uint64_t totalTime; // 处理到该条数据时累计的总时间 uint64_t relativeTime; // 该条数据对应的相对时间 }; 但是注意:在原来代码中,我们只保存了最后一次处理的数据(三个全局数组),现在需要保存每个设备的n条数据。而且,不同设备的数据是分开的。 处理流: 1.Updatedata函数中,原来处理一条数据,现在要循环处理n条数据(假设frame中包含n条数据,我们需要知道每条数据在frame中的位置)。 2. 对于每条数据,更新设备的TrackTime状态,并记录当前这条数据对应的状态(StateData)到该设备对应的列表中。 注意:由于设备一次发送n条数据,所以我们需要修改函数参数,比如传递一个数据列表,或者修改frame的结构,使其包含多条数据。 假设frame结构变化: 原来一条数据:frame[0]是头部,然后[1]是s1,[2]是trackFlag等。 现在n条数据:frame[0]可能是设备号,frame[1]可能是n的值,然后后面是n条数据,每条数据占3个字节(假设)?具体需要根据协议。 由于问题中没有给出具体的frame结构,我们假设新的frame结构如下(举例): 字节0: 设备号(devnum) 字节1: 数据条数n 接下来每3个字节代表一条数据: 字节0: 数据头(忽略或校验等) 字节1: s1 字节2: trackFlag 因此,我们需要修改Updatedata函数,使其能够解析n条数据。 另外,原来的全局数组TrackingDataStateBuf和TrackingTimeBuf需要被替换掉,因为现在每个设备有多条数据,而且有多个设备。我们可以使用一个QMap<int, QList<StateData>>来存储每个设备的多条数据结果。 修改后的代码结构: 在类定义中(.h文件)修改: struct StateData { uint8_t s1; uint8_t trackFlag; uint64_t initTrackTime; // 注意:这个对于同一个设备的连续数据,初始时间是一样的(即第一次激活的时间),所以实际上在同一个设备的n条数据中,这个值可能都是相同的(除非在第一条就初始化) uint64_t totalTime; // 处理到该条数据时累计的总时间(这个值会随着每条数据的处理更新) uint64_t relativeTime; // 该条数据的相对时间(可能相对于初始时间) }; QMap<int, TrackTime> TrackTimeMap; // 每个设备的状态(用于记录连续状态) QMap<int, QList<StateData>> TrackDataMap; // 每个设备的多条数据结果 注意:我们不再使用TrackingDataStateBuf和TrackingTimeBuf,而是用TrackDataMap来存储结果。 在Updatedata函数中,我们按照以下步骤处理: 1. 解析frame,得到设备号devnum和数据条数n。 2. 获取该设备对应的TrackTime状态(如果不存在,会自动创建一个默认的)。 3. 为该设备创建一个新的QList<StateData>(或者清空上一次的,或者追加?根据需求,如果每次都是新的一组数据,则可以先清空,但注意:如果设备可能同时发送多组数据,则可能需要考虑是否追加。根据问题,设备一次发n条,然后下一次再发n条,所以我们每次处理一组n条数据,可以覆盖上一次该设备的数据,或者追加?这里根据需求,问题没有明确,我们先假设每次更新该设备的数据时,我们只保留最新的n条数据,所以每次处理前先清空该设备对应的列表) 4. 循环处理每条数据(循环n次): a. 从frame中取出第i条数据的s1和trackFlag。 b. 更新该设备的TrackTime状态(根据trackFlag更新,和原来逻辑一样)。 c. 计算relativeTime(例如,当前数据的时间戳减去初始时间?注意,在代码中nowTime可能是同一个时间?但实际上,每条数据的时间应该是不同的。问题在于,我们如何获得每条数据的时间?原来代码中nowTime是0,这显然不对,需要修改。这里我们假设每条数据都带有一个时间戳,或者接收时记录时间。但原代码中并没有,所以我们需要考虑时间如何获取。) 时间问题: 原代码中,nowTime被设置为0,这显然是不对的。在实际应用中,每条数据应该有一个时间戳。这个时间戳可能是数据自带的,或者是接收到数据时打上的系统时间。由于原代码没有,我们需要根据实际情况修改。 假设我们现在在接收时,为每条数据打上时间戳(例如,在开始接收n条数据时记录一个时间,然后每条数据的时间间隔?或者每条数据都带有一个时间?)。这里,由于问题没有明确,我们假设frame中不包含时间,那么我们可以用接收时刻的时间作为每条数据的时间。但是,n条数据是一次性接收的,所以它们的时间戳应该非常接近,但严格来说,每条数据的时间戳应该是不同的(比如按照顺序递增一个固定间隔?)。或者,我们可以使用同一个时间戳(即接收时刻)?这取决于应用。 为了简单起见,我们假设在接收这n条数据时,我们为每条数据分配一个时间戳,这个时间戳等于接收开始时间加上一个偏移(比如每条的间隔是固定的,或者数据本身带有时间信息)。但原代码中没有,所以我们需要修改函数参数,传递一个时间戳列表。 由于问题中未提供时间戳的获取方式,我们假设每条数据的时间戳由外部提供,并作为参数传入。因此,修改Updatedata函数: bool class1::Updatedata(unsigned char *frame, uint recvsize, int devnum, const QList<uint64_t>& timeStamps) 其中timeStamps是一个列表,包含n条数据的时间戳(与frame中的n条数据一一对应)。 这样,在处理第i条数据时,我们可以用timeStamps[i]作为nowTime。 修改后的Updatedata函数伪代码: 1. 解析frame,得到n(假设frame[0]是设备号,frame[1]是n,然后后面是n条数据,每条数据占3字节,其中每条数据的前两个字节分别是s1和trackFlag,第一个字节可能是头或校验,这里我们忽略)。 注意:这里解析方式需要根据实际协议调整。 2. 检查timeStamps的大小是否等于n,如果不等于,则出错。 3. 获取该设备对应的TrackTime状态:trackData = TrackTimeMap[devnum] 4. 清空该设备在TrackDataMap中的列表(如果之前有数据,则清除,然后保存新的数据) 5. 循环i从0到n-1: a. 从frame中取出第i条数据的s1和trackFlag(假设第i条数据在frame中的位置是:2 + i*3 和 2 + i*3 +1 和 2 + i*3 +2,其中第0字节是设备号,第1字节是n,所以数据从第2字节开始) b. 获取当前数据的时间戳:nowTime = timeStamps[i] c. 更新trackData的状态(按照原来的逻辑,但注意:原来代码中relativeTime是123,这里我们可能需要重新计算,比如relativeTime = nowTime - trackData.initTrackTime) d. 根据更新后的状态,创建一个StateData结构,记录当前数据的状态: state.s1 = s1; state.trackFlag = trackFlag; state.initTrackTime = trackData.initTrackTime; // 注意:这个初始时间在同一个设备的多条数据中可能不变(除非在第一条数据时初始化) state.totalTime = trackData.totalTime; // 更新到当前数据时的总时间 state.relativeTime = nowTime - trackData.initTrackTime; // 或者根据需求计算 e. 将该StateData添加到TrackDataMap[devnum]列表中。 f. 注意:在更新trackData时,我们使用了当前数据的时间戳和trackFlag,所以下一条数据会基于更新后的状态。 6. 循环结束后,该设备的TrackTimeMap[devnum]已经更新到处理完n条数据后的状态。 注意:原来的全局数组TrackingDataStateBuf和TrackingTimeBuf不再使用,所以删除它们。在类中定义改为使用TrackDataMap。 代码示例: 由于原代码中,Updatedata函数只处理一条数据,现在修改为处理n条。我们重新编写Updatedata函数。 假设frame结构: frame[0] = devnum (设备号) // 注意:参数中已经传入了devnum,所以这里可能不需要,或者frame中不包含设备号?所以需要根据实际情况调整。 frame[1] = n (数据条数) 然后后面是n条数据,每条数据有3个字节:第一个字节(可能是预留),第二个字节是s1,第三个字节是trackFlag。 由于参数中已经传入了devnum,所以frame中可能不包含设备号,而是直接包含n和n条数据。我们假设frame结构如下: frame[0] = n frame[1] = 第一条数据的第一个字节(预留) frame[2] = 第一条数据的s1 frame[3] = 第一条数据的trackFlag frame[4] = 第二条数据的第一个字节 ... 因此,数据总大小:1 + n*3 = recvsize 修改后的Updatedata函数: ```cpp #include <QList> // 在.h文件中定义StateData结构 /* struct StateData { uint8_t s1; uint8_t trackFlag; uint64_t initTrackTime; uint64_t totalTime; uint64_t relativeTime; }; */ bool class1::Updatedata(unsigned char *frame, uint recvsize, int devnum, const QList<uint64_t>& timeStamps) { // 解析第一条:frame[0] 是n uint8_t n = frame[0]; // 检查数据大小 if (recvsize != 1 + n*3) { // 数据大小不匹配 return false; } if (timeStamps.size() != n) { return false; } // 获取该设备的TrackTime状态 TrackTime& trackData = TrackTimeMap[devnum]; // 获取该设备的StateData列表(并清空之前的) QList<StateData>& dataList = TrackDataMap[devnum]; dataList.clear(); dataList.reserve(n); // 预分配空间 for (int i = 0; i < n; i++) { // 每条数据在frame中的起始位置: 1 + i*3 uint8_t s1 = frame[1 + i*3 + 0]; // 注意:这里假设每条数据3个字节,第一个字节是s1?根据原代码,原来s1在frame[1] uint8_t trackFlag = frame[1 + i*3 + 1]; // 原来在frame[2] // 这里我们忽略每条数据的第一个字节(因为原代码中frame[0]是头部,但原代码中并没有使用,所以这里我们直接取s1和trackFlag) // 但是注意:原代码中frame[1]是s1,frame[2]是trackFlag,现在第i条数据中,第0个字节(相对于本条)是什么?根据上面假设,每条数据有3个字节,我们取第1个字节作为s1,第2个字节作为trackFlag。 // 所以上面代码中,s1取的是1+i*3+0(即每条数据的第一个字节),trackFlag是1+i*3+1(第二个字节)。但是原代码中s1是frame[1],trackFlag是frame[2],所以这里我们调整一下:实际上,在frame中,第0字节是n,然后第1字节是第0条数据的预留字节(我们不用),第2字节是第0条数据的s1,第3字节是第0条数据的trackFlag。所以: // 第i条数据:s1在frame[1 + i*3 + 1] 位置,trackFlag在frame[1 + i*3 + 2]位置。 // 修改如下: s1 = frame[1 + i*3 + 1]; trackFlag = frame[1 + i*3 + 2]; uint64_t nowTime = timeStamps[i]; // 当前数据的时间戳 // 更新trackData状态(原逻辑) if (!trackData.hasInit && trackFlag == 1) { trackData.initTrackTime = nowTime; trackData.lastTrackTime = nowTime; trackData.isActive = true; trackData.hasInit = true; } if (trackData.isActive && trackData.hasInit) { uint64_t differ = nowTime - trackData.lastTrackTime; if (differ >= 0) { // 实际上differ不可能是负数,但可以这样写 trackData.totalTime += differ; } trackData.lastTrackTime = nowTime; if (trackFlag == 0) { trackData.isActive = false; } } else if (!trackData.isActive && trackFlag == 1 && trackData.hasInit) { trackData.lastTrackTime = nowTime; trackData.isActive = true; } // 计算相对时间 uint64_t relativeTime = 0; if (trackData.hasInit) { relativeTime = nowTime - trackData.initTrackTime; } else { // 如果还没有初始化,则相对时间设为0?或者根据需求 relativeTime = 0; } // 创建StateData并保存 StateData state; state.s1 = s1; state.trackFlag = trackFlag; state.initTrackTime = trackData.initTrackTime; // 注意:这个初始时间可能被上一条数据初始化 state.totalTime = trackData.totalTime; // 到当前数据为止的总激活时间 state.relativeTime = relativeTime; dataList.append(state); } return true; } ``` 注意:以上代码中,我们假设了frame的结构,并且调整了s1和trackFlag的位置(根据原代码和新的frame结构)。如果实际frame结构不同,请根据实际情况调整。 另外,关于时间戳的获取,我们通过参数timeStamps传入,调用者需要提供每条数据的时间戳。 关于存储:我们使用TrackDataMap来存储每个设备的最新n条数据(每次调用Updatedata会覆盖该设备之前的数据)。如果需要保存历史数据,可以修改为追加,但这样可能会占用大量内存,所以需要根据需求决定。 总结: - 我们修改了数据结构,增加了StateData和QMap<int, QList<StateData>> TrackDataMap。 - 修改了Updatedata函数,使其能够处理n条数据,并更新每个设备的状态,同时保存每条数据的状态。 - 需要外部传入时间戳列表。 但是,问题中原来的结构是QMap<int, TrackTime>,现在增加了一个TrackDataMap,这样设计是否合理?另外,问题中原来使用了全局数组,现在改为每个设备一个列表,这样就能存储每个设备的n条数据。 问题:使用QMap<int, QList<TrackTime>>来存储不同设备的n条数据可以吗? - 注意,TrackTime结构是用于记录设备的状态(即随着时间变化的状态,是累积的),而我们需要为每条数据记录当时的状态(包括s1、trackFlag、以及当时的总时间、相对时间等)。所以不能直接用TrackTime来存储每条数据,因为TrackTime是状态,而我们需要的是数据快照(包含状态和原始数据)。因此,我们设计了StateData来存储每条数据的结果。 所以,使用QMap<int, QList<StateData>>是合适的。 最后,由于问题中给出的代码片段是片段,我们需要在类定义中添加StateData结构,并添加TrackDataMap成员。 修改后的类定义(.h文件)示例: ```cpp class class1 { // ... 其他 struct TrackTime { uint64_t initTrackTime; uint64_t lastTrackTime; uint64_t totalTime = 0; bool isActive = false; bool hasInit = false; }; struct StateData { uint8_t s1; uint8_t trackFlag; uint64_t initTrackTime; uint64_t totalTime; uint64_t relativeTime; }; QMap<int, TrackTime> TrackTimeMap; QMap<int, QList<StateData>> TrackDataMap; // 新增 // 原来的全局数组不再需要,删除 // uint8_t TrackingDataStateBuf[2]; // uint64_t TrackingTimeBuf[3]; // ... bool Updatedata(unsigned char *frame, uint recvsize, int devnum, const QList<uint64_t>& timeStamps); }; ``` 这样修改后,就可以满足一次接收n条数据的需求。 相关问题: 1. 如果设备发送的数据条数n很大,如何优化内存使用? 2. 如果时间戳不是外部传入,而是数据自带的,如何修改代码? 3. 如果不同设备的数据顺序不一致(即不是按设备号顺序发送),如何处理? 4. 在多线环境下,如何保证TrackTimeMap和TrackDataMap的线安全? 请按照格式输出。</think>### 解决方案:处理设备一次发送多条数据 #### 问题分析 原代码设计用于处理设备**单条数据**,使用 `QMap<int, TrackTime>` 存储设备状态。当设备改为一次发送 `n` 条数据时,需要: 1. 修改数据结构以存储多条数据 2. 按顺序处理每条数据并更新设备状态 3. 保存每条数据的独立状态(如相对时间) #### 修改方案 使用 `QMap<int, QList<TrackTime>>` 存储每个设备的 `n` 条数据状态,并为每条数据独立计算状态值。 ##### 类定义修改(.h 文件) ```cpp class class1 { public: // 状态数据结构(保持不变) struct TrackTime { uint64_t initTrackTime; uint64_t lastTrackTime; uint64_t totalTime = 0; bool isActive = false; bool hasInit = false; }; // 修改为存储每个设备的 TrackTime 列表 QMap<int, QList<TrackTime>> TrackTimeMap; // 关键修改 // 新增:存储每个设备的多条数据状态 QMap<int, QList<uint8_t>> TrackingDataStateBufMap; // 存储 s1 和 trackFlag QMap<int, QList<uint64_t>> TrackingTimeBufMap; // 存储时间数据 // 其他成员... bool Updatedata(unsigned char* frame, uint recvsize, int devnum); }; ``` ##### 数据处理逻辑修改(.cpp 文件) ```cpp bool class1::Updatedata(unsigned char* frame, uint recvsize, int devnum) { // 1. 解析数据条数 (假设 frame[0] = n) uint8_t n = frame[0]; // 首字节表示数据条数 // 2. 初始化设备存储列表 TrackTimeMap[devnum].clear(); TrackingDataStateBufMap[devnum] = QList<uint8_t>(); TrackingTimeBufMap[devnum] = QList<uint64_t>(); // 3. 处理每条数据 for (int i = 0; i < n; ++i) { // 解析单条数据 (假设每条数据占3字节) uint8_t s1 = frame[1 + i * 3]; // 数据位置:1,4,7... uint8_t trackFlag = frame[2 + i * 3]; // 数据位置:2,5,8... // 获取当前设备的状态列表引用 QList<TrackTime>& trackList = TrackTimeMap[devnum]; // 初始化当前数据的状态 TrackTime current; if (trackList.size() > 0) { // 继承上一条数据的最终状态 current = trackList.last(); } // 更新时间状态(核心逻辑保持不变) uint64_t nowTime = GetCurrentTime(); // 需实现时间获取函数 if (!current.hasInit && trackFlag == 1) { current.initTrackTime = nowTime; current.lastTrackTime = nowTime; current.isActive = true; current.hasInit = true; } if (current.isActive && current.hasInit) { uint64_t differ = nowTime - current.lastTrackTime; if (differ >= 0) current.totalTime += differ; current.lastTrackTime = nowTime; if (trackFlag == 0) current.isActive = false; } else if (!current.isActive && trackFlag == 1 && current.hasInit) { current.lastTrackTime = nowTime; current.isActive = true; } // 保存当前数据状态 trackList.append(current); // 计算相对时间 uint64_t relativeTime = current.hasInit ? (nowTime - current.initTrackTime) : 0; // 存储数据状态 TrackingDataStateBufMap[devnum] << s1 << trackFlag; TrackingTimeBufMap[devnum] << current.initTrackTime << current.totalTime << relativeTime; } return true; } ``` #### 关键修改说明 1. **数据结构改造**: - `TrackTimeMap` 改为 `QMap<int, QList<TrackTime>>` - 新增两个 QMap 分别存储状态和时间数据: ```cpp QMap<int, QList<uint8_t>> TrackingDataStateBufMap; QMap<int, QList<uint64_t>> TrackingTimeBufMap; ``` 2. **数据处理流**: - **步骤1**:解析数据条数 `n`(假设首字节表示条数) - **步骤2**:初始化设备的存储列表 - **步骤3**:循环处理每条数据: - 继承上条数据状态(首条数据初始化新状态) - 更新跟踪时间状态(与原逻辑一致) - 保存当前数据状态到列表 3. **状态继承机制**: ```cpp // 继承上一条数据的最终状态 if (trackList.size() > 0) { current = trackList.last(); } ``` 确保设备的多条数据状态连续更新 4. **数据存储**: - 使用 `<<` 操作符追加数据到 QList - 示例存储格式: ```cpp TrackingDataStateBufMap[devnum] << s1 << trackFlag; TrackingTimeBufMap[devnum] << initTime << totalTime << relativeTime; ``` #### 数据结构验证 `QMap<int, QList<TrackTime>>` 完全满足需求: 1. **键值设计**: - `int` → 设备ID - `QList<TrackTime>` → 该设备的 `n` 条数据状态 2. **顺序保证**: - QList 保证数据顺序与接收顺序一致 3. **状态连续性**: - 每条数据继承上条状态,实现状态连续更新 4. **访问效率**: - QMap 查找复杂度 O(log n) - QList 索引访问复杂度 O(1) #### 使用示例 ```cpp // 获取设备5的第3条数据状态 TrackTime state = TrackTimeMap.value(5).at(2); // 获取设备5的所有相对时间 QList<uint64_t> relTimes; for (const auto& track : TrackTimeMap.value(5)) { relTimes << (track.lastTrackTime - track.initTrackTime); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值