问个基础的问题?比较急!!!办法可用就给分,信誉保证!!

wliaoc 2010-07-22 04:54:27
一组数据触发中断对这组数据进行拆包,该数据包中有两部分数据(A、B)组成一样,两部分都使用消息触发方式处理,就是两部分数据都在各自的消息函数中处理,处理过程会调用同一个函数(C),该函数输入为数据,输出为全局变量(D) - 一个结构体,处理完的全局变量会再触发一个消息(E)来保存拆包好的数据。
我想问的是,因为两部分都调用同一个函数进行拆包,输出又是同一个全局变量(结构体),如果两部分数据同时触发各自的消息处理,会不会出现一种情况,A数据在C中处理完生成D后,发给E等待处理时,B数据也送给C处理修改了D,导致发给E的数据不对了。

如果有这个问题,怎么处理呢?用时间锁可以吗?应该在那加?
原本的程序只有处理A部分数据,B部分是后面加的,如何在不大改原有源代码的情况下实现数据(A、B)的存储。
...全文
193 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyc_gz 2010-07-26
  • 打赏
  • 举报
回复
路过学习
zjz800800 2010-07-26
  • 打赏
  • 举报
回复
补充一下,虽然是消息队列只在一个线程的话,不用同步。
但是如果程序逻辑关系比较复杂,所以可以简单使用同步机制对C做处理,具体看你需求。
xfdz389307541 2010-07-26
  • 打赏
  • 举报
回复
看贴回贴
zjz800800 2010-07-26
  • 打赏
  • 举报
回复
既然是数据同步,为什么不使用事件量或者互斥量或者临界区,信号量大财小用了在这里不使用。

对C进行保护即可。
wliaoc 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 gz_qmc 的回复:]
引用 17 楼 wliaoc 的回复:

引用 16 楼 gz_qmc 的回复:
应该是:两条消息间没有缓冲导致第一条来不及处理就被覆盖了

那遇到这种情况应该怎么办呢?



唯一的办法就是开缓冲,链表就是最经典的方式
实在太多就用文件,文件本身也是一种"对列"
[/Quote]

我跟调了一下,在消息处理里面加断点,发现两次都有进入执行,但是保存下来的只有一个,保存过程我还没有细看,我想可能是存储的问题,因为有进入处理,至少说明两次消息都处理了,至于处理的数据是否一样,也就是是否被覆盖有待查证。
哎,主要是消息太多了,这个发给那个,那个又发另一个,一个数据进来,消息要传5,6个才最终保存,都用链表,改动还是挺多的。
gz_qmc 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wliaoc 的回复:]

引用 16 楼 gz_qmc 的回复:
应该是:两条消息间没有缓冲导致第一条来不及处理就被覆盖了

那遇到这种情况应该怎么办呢?
[/Quote]


唯一的办法就是开缓冲,链表就是最经典的方式
实在太多就用文件,文件本身也是一种"对列"
wliaoc 2010-07-26
  • 打赏
  • 举报
回复
怕分数不够,又另开了一个问题,请大家一起帮忙看看。
http://topic.csdn.net/u/20100726/10/88c23e62-b002-492c-9e21-aa509d7d9564.html
wliaoc 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gz_qmc 的回复:]
应该是:两条消息间没有缓冲导致第一条来不及处理就被覆盖了
[/Quote]
那遇到这种情况应该怎么办呢?
gz_qmc 2010-07-26
  • 打赏
  • 举报
回复
应该是:两条消息间没有缓冲导致第一条来不及处理就被覆盖了
wliaoc 2010-07-26
  • 打赏
  • 举报
回复
为了测试这种方法,我试着在一个中断里发两条一样的消息处理,只是在中间改了一个数据,发现数据存储时只保存了后一条数据,是两条消息间没有缓冲导致第一条来不及吗?还是保存需要时间,来不及处理?
wliaoc 2010-07-26
  • 打赏
  • 举报
回复
这贴先结了,单线程的问题大概是弄明白了,有不懂的话,我再开贴问,谢谢大家!!!
散分!!
gz_qmc 2010-07-24
  • 打赏
  • 举报
回复
全局链表相当于自己定义了一个参数对列,不管中断如何执行

消息总是按顺序排队的.

如果参数也按顺序排队.一一对应应该是没有问题的.


网络通讯其实就是采取这样的数据缓冲的办法.
服务器不停地(线程)或按时地(中断)从不同的IP取的数据包
因为包的结构是相同的,就把接收到的包保存到链表里.
然后另一线程或中断从链头不断处理,处理完一个删一个
这其实就是缓冲原理,数据不会乱,也不会丢包
gz_qmc 2010-07-23
  • 打赏
  • 举报
回复
消息另外有一块操作系统分配的内存来保存,称之为:消息队列
你每发送一次消息,他就在队列增加一个消息的结构体实例.

如果你在多线程里共享同一个全局变量,你担心的问题就一定会发生.

如果要避免张冠李戴的问题,全局变量要改为全局链表变量.

每个消息传递的不是D,而是D链里的某一个.执行消息的时候把相应的链位清除.

也就是说,多线程,要与变量输入与处理一一对应,共享一个变量是不可能的,
互斥也办不到,互斥只能实用于多对一的情况.
liyinlei 2010-07-23
  • 打赏
  • 举报
回复
消息队列只在一个线程的话,就不用同步了。消息是先进先出的。


“输出为全局变量(D) - 一个结构体,处理完的全局变量会再触发一个消息(E)来保存拆包好的数据。”
这个消息E 也是PostThreadMessage投递的吗? 如果是,那么有可能在投递消息E之前,又投递了一个拆包的新消息,这样的话,在保存D之前,D已经被更改了。
输出的D不应该用全局变量,应当动态创建,投递给E时,将这个对象作为参数传过去,在处理消息E时,保存数据之后将传过来的这个对象销毁。
wliaoc 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cnzdgs 的回复:]
把函数C改一下,动态分配输出数据的结构体。
[/Quote]
能具体点吗?目前用的C函数是没有输入输出参数的,只是将全局数据A或B换算成D,我想是否把C变成带参数输入的函数。但是,C其实是多个函数,我在描述时把它简化了
wliaoc 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lazy_2010 的回复:]
你得描述清楚消息是什么,是 windows 消息,还是 PostMessage,还是 SetEvent,或者其它;

是否在同一个线程,决定了是否需要互斥;

一般情况下,同一个消息队列中的 PostMessage 的两个消息不可能同时调用 WindowProc,除非你有意这样做,比如在处理第一个消息的时候通过 SendMessage 发出第二个消息;

同一个类,可能运行在不同的线程……
[/Quote]
我是在线程类里处理的,用的是PostThreadMessage消息,消息是在线程类里传递的
同一个类,可能运行在不同的线程,所以是否在同一个类不重要,重要的是代码是否运行在不同的线程。
代码没运行在不同线程中,线程类里创建了三个串口中断,但是每个中断都有对应不同的消息处理
wliaoc 2010-07-23
  • 打赏
  • 举报
回复
至少上面这个问题没有多线程的问题。倒是另外两个中断处理的数据一模一样,我打算用同一消息处理,可能会出现张冠李戴的问题。
gz_qmc提的用全局链表的方法我想可以解决问题。我试试,先谢了!!!
oyljerry 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wliaoc 的回复:]

这个消息E 也是PostThreadMessage投递的吗? 如果是,那么有可能在投递消息E之前,又投递了一个拆包的新消息,这样的话,在保存D之前,D已经被更改了。
输出的D不应该用全局变量,应当动态创建,投递给E时,将这个对象作为参数传过去,在处理消息E时,保存数据之后将传过来的这个对象销毁。

我就是担心有这个问题。
另外我尝试用中断处理时用个数组先获取A数据,然后用PostThre……
[/Quote]
A,B分配的数组,同时传指针,这样处理完了以后,delete等释放
wliaoc 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gz_qmc 的回复:]
消息另外有一块操作系统分配的内存来保存,称之为:消息队列
你每发送一次消息,他就在队列增加一个消息的结构体实例.

如果你在多线程里共享同一个全局变量,你担心的问题就一定会发生.

如果要避免张冠李戴的问题,全局变量要改为全局链表变量.

每个消息传递的不是D,而是D链里的某一个.执行消息的时候把相应的链位清除.

也就是说,多线程,要与变量输入与处理一一对应,共享一个变量是不可……
[/Quote]

我认真顺了一遍流程,应该不是多线程处理
wliaoc 2010-07-23
  • 打赏
  • 举报
回复
这个消息E 也是PostThreadMessage投递的吗? 如果是,那么有可能在投递消息E之前,又投递了一个拆包的新消息,这样的话,在保存D之前,D已经被更改了。
输出的D不应该用全局变量,应当动态创建,投递给E时,将这个对象作为参数传过去,在处理消息E时,保存数据之后将传过来的这个对象销毁。


我就是担心有这个问题。
另外我尝试用中断处理时用个数组先获取A数据,然后用PostThreadMessage触发消息处理,但是发现接收到的数据已经是无效数据了,也就是说,数组被自动释放了。这种情况应该怎么办呢?
是否可以用分配内存的方法,处理完再释放?
如果是这样,是否要给A、B分别分配数组,消息处理完再释放,释放的话,怎么区别A还是B分配的数组?
加载更多回复(5)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧