主题:请帮忙分析一下

  共有28227人关注过本帖    
linman
1楼


请帮忙分析一下  发帖心情 Post By:2009-9-3 15:38:00   [只看该作者]

c#程序中设置了两个线程,一个是CAN接收线程,一个是数据解析线程,它们公用一个buffer,接收线程等待数据进来就放入buffer,解析线程以5ms为周期从buffer中读数进行解析;当以5ms为周期或更快速度发送数据时,从解析线程中读这个buffer中的数据就不对了,比如连续发了id为0 、1、2的CAN数据,解析线程读到的ID有可能是0、1、1,为什么会发生这种现象?两个线程优先级都是abovenormal。

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
lqk
2楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2009-9-3 16:04:00   [只看该作者]

当以5ms为周期或更快速度发送数据时,CAN接收线程将以5ms或更快的速度刷新你的buffer,而你的数据解析线程以5ms为周期工作,这样有数据就会丢失或出错
建议在CAN接收线程中用一环形buffer缓存收到的数据。

  单帖管理 | 引用 | 回复 回到顶部
linman
3楼


  发帖心情 Post By:2009-9-3 16:26:00   [只看该作者]

可是如果解析的线程不读走buffer中的数据,buffer不会被清阿?难道向buffer中添加新的数据会把以前的冲掉吗?为什么环形buffer能解决问题呢?

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
lqk
4楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2009-9-3 17:10:00   [只看该作者]

在接收线程中,只要收到一帧数据就放入环形buffer中
在解析线程中解析环形buffer中的数据,一直将buffer中的数据读空为止,对环buf操作时要注意线程同步.

  单帖管理 | 引用 | 回复 回到顶部
linman
5楼


  发帖心情 Post By:2009-9-3 18:12:00   [只看该作者]

我用的buffer是个ArrayList,接收线程只要收到数据就添加到ArrayList中,解析线程每次获得ArrayList中的所有元素进行解析,然后清空,在对ArrayList进行添加和遍历时用Mutex进行同步,这样有问题吗?

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
lqk
6楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2009-9-4 9:22:00   [只看该作者]

你的同步是不是在解析线程解析数据时,接收线程就不能向ArrayList添加数据了.我觉得这是根你两个线程的配合有关系。

  单帖管理 | 引用 | 回复 回到顶部
linman
7楼


  发帖心情 Post By:2009-9-4 9:49:00   [只看该作者]

对,解析时不能添加,添加时解析也不能访问,就是两个线程在使用buffer时都先waitone(),使用后再ReleaseMutex(),请教应该怎么配合呢

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
lqk
8楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2009-9-4 10:49:00   [只看该作者]


数据接收线程:
bResult = CAN_GetNextReceivedFrame( ceCAN->m_hCAN, &ceCAN->RxMFrame );
if( bResult )
{
    memcpy( ceCAN->ReceiveBuf[ceCAN->m_bufPutIdx], &ceCAN->RxMFrame, 13 );
    ceCAN->m_bufPutIdx = ( ceCAN->m_bufPutIdx+1 )% BUF_MAX;
}

数据解析线程:
    while( m_bufGetIdx != m_bufPutIdx )
    {
        memcpy( buf, ReceiveBuf[m_bufGetIdx], i );
        //数据解析
        m_bufGetIdx = (m_bufGetIdx+1) % BUF_MAX;
    }

两线程不需要同步

  单帖管理 | 引用 | 回复 回到顶部
linman
9楼


  发帖心情 Post By:2009-9-4 13:24:00   [只看该作者]

谢谢您的回复 ,主要我不明白为什么会发生这种现象?用环形为什么就能解决?另外,C#的话我要怎么构造呢?

  单帖管理 | 引用 | 回复 回到顶部
linman
10楼


  发帖心情 Post By:2009-9-4 13:43:00   [只看该作者]

是否需要一个标志用于同步两个线程,是因为没有做这个同步处理才导致发生这种现象吗?

  单帖管理 | 引用 | 回复 回到顶部
qjh2008
11楼


  发帖心情 Post By:2009-9-8 14:54:00   [只看该作者]

使用serialport控件很好用的

  单帖管理 | 引用 | 回复 回到顶部
zhl
12楼


  发帖心情 Post By:2009-9-8 16:48:00   [只看该作者]

两个不同的线程使用了一个数据区,应用程序中是需要加以保护的。

  单帖管理 | 引用 | 回复 回到顶部

返回首页

请帮忙分析一下

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: