关于在串口接收时多线程同步的问题? ( 积分: 50 )

  • 主题发起人 主题发起人 jainibunan
  • 开始时间 开始时间
J

jainibunan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个程序,想用两个线程来做,一个Thread1负责接收数据,另一个thread2负责把接收到的数据画到tchart上,数据保存在全局数组里,现在我碰到了如何将这两个线程同步的问题,我的逻辑是在thread1把数据接收进来保存到数组后,通知thread2,让它把刚才接收到的数据画出来,画好后,再通知thread1,让它继续把接收到的数据放到全局数组里来。我是这样做的,在thread1里:
EnterCriticalSection(CS);
for i:=0 to 3do
begin
Datal:=DataArray[2*i];
Datah:=(DataArray[2*i+1] and $0F)*16*16;
Damp:=Datah+Datal;
end;
LeaveCriticalSection(CS);
在thread2里:
EnterCriticalSection(CS);
for i:=0 to 3do
begin
Datal:=DataArray[2*i];
Datah:=(DataArray[2*i+1] and $0F)*16*16;
Damp:=Datah+Datal;
end;
LeaveCriticalSection(CS);
for i:=0 to 3do
With MainForm.Chart1.Series[0]do
Addy(Damp,'',clred);
可这样做,程序提示 variant or safe array out of bounds
我不知道那个cs是不是这样用,另外我用thread1时却没错误。
请大家指点一下!
 
提示是数组越界,你检查一下数组
就靠你发的这点代码我看不出哪里有错
 
没必要这么复杂吧?
收的线程只管收,不与画的关联。
画的只管画,不管收,把数据画完就停,有数据就再画。
因为画的线程才管数据的完整与数据结构。这样,数据才能有效的处理。
个人意见,也是才做了一个相类的东西。
 
我感觉你这个问题可以不用2个线程来做了,一个线程够了,你可以在接收数据的线程中,当接收完时就触发一个windows消息,通过获得这个消息来处理接收的数据
 
开辟数据缓冲,用读写指针控制就可以了
 
to 天浪影
我在只用thread1时,没有数组越界错误,用两个时却有此错误,不知怎回事?逐步调试也检查不出来呢
to shangchao
能说清楚一点吗?画的线程与接受数据的线程怎会没关系呢?只有接受到新的数据才能画啊,而且在画图时,不能把接受的数据存到数组来,否则就要乱了哦。(在thread1把数据接收进来保存到数组后,通知thread2,让它把刚才接收到的数据画出来,画好后,再通知thread1,让它继续把接收到的数据放到全局数组里来。)这是我的逻辑呢
to dennyshao001
你的想法的确挺有道理的,最近我也在想这个方法,可是我不清楚的是,比如用sendmessage发送消息给主线程时,它什么时候会返回呢,是等主线程中对应的数据处理过程完了后,这边线程才继续执行吗? 恳请指点一下...
to jamcky,
你的想法我还不太明白,能说的具体些吗?
谢谢诸位!
 
procedure setrefresh(value:boolean);
property refresh:boolean read Frefresh write setrefresh;
procedure Tdsnmp.setrefresh(value:boolean);
begin
try
if value then
Sendmessage(mainform.Handle,WM_REFRESH,WM_REFRESH_ENABLE,0)
else
Sendmessage(mainform.Handle,WM_REFRESH,WM_REFRESH_UNENABLE,0);
frefresh := Value;
except
exit;
end;
end;

给你个参考
当你数据采集完后,就把refresh:=true,这样就可以及时触发接收数据的程序了
 
接受答案了!
 

Similar threads

M
回复
1
查看
280
zw84611
Z
C
回复
3
查看
429
coolingxyz
C
A
回复
20
查看
1K
Andy_chen
A
A
回复
8
查看
361
accelerator
A
Q
回复
4
查看
370
穿越沦陷的爱
穿
后退
顶部