主題:請(qǐng)幫忙分析一下 共有45821人關(guān)注過(guò)本帖 |
---|
linman |
1樓 |
請(qǐng)幫忙分析一下 Post By:2009-9-3 15:38:00 [只看該作者]
c#程序中設(shè)置了兩個(gè)線程,一個(gè)是CAN接收線程,一個(gè)是數(shù)據(jù)解析線程,它們公用一個(gè)buffer,接收線程等待數(shù)據(jù)進(jìn)來(lái)就放入buffer,解析線程以5ms為周期從buffer中讀數(shù)進(jìn)行解析;當(dāng)以5ms為周期或更快速度發(fā)送數(shù)據(jù)時(shí),從解析線程中讀這個(gè)buffer中的數(shù)據(jù)就不對(duì)了,比如連續(xù)發(fā)了id為0 、1、2的CAN數(shù)據(jù),解析線程讀到的ID有可能是0、1、1,為什么會(huì)發(fā)生這種現(xiàn)象??jī)蓚(gè)線程優(yōu)先級(jí)都是abovenormal。
|
|
單帖管理 | 引用 | 回復(fù) |
lqk |
2樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2009-9-3 16:04:00 [只看該作者]
當(dāng)以5ms為周期或更快速度發(fā)送數(shù)據(jù)時(shí),CAN接收線程將以5ms或更快的速度刷新你的buffer,而你的數(shù)據(jù)解析線程以5ms為周期工作,這樣有數(shù)據(jù)就會(huì)丟失或出錯(cuò)
建議在CAN接收線程中用一環(huán)形buffer緩存收到的數(shù)據(jù)。 |
單帖管理 | 引用 | 回復(fù) |
linman |
3樓 |
Post By:2009-9-3 16:26:00 [只看該作者]
可是如果解析的線程不讀走buffer中的數(shù)據(jù),buffer不會(huì)被清阿?難道向buffer中添加新的數(shù)據(jù)會(huì)把以前的沖掉嗎?為什么環(huán)形buffer能解決問(wèn)題呢?
|
|
單帖管理 | 引用 | 回復(fù) |
lqk |
4樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2009-9-3 17:10:00 [只看該作者]
在接收線程中,只要收到一幀數(shù)據(jù)就放入環(huán)形buffer中
在解析線程中解析環(huán)形buffer中的數(shù)據(jù),一直將buffer中的數(shù)據(jù)讀空為止,對(duì)環(huán)buf操作時(shí)要注意線程同步. |
單帖管理 | 引用 | 回復(fù) |
linman |
5樓 |
Post By:2009-9-3 18:12:00 [只看該作者]
我用的buffer是個(gè)ArrayList,接收線程只要收到數(shù)據(jù)就添加到ArrayList中,解析線程每次獲得ArrayList中的所有元素進(jìn)行解析,然后清空,在對(duì)ArrayList進(jìn)行添加和遍歷時(shí)用Mutex進(jìn)行同步,這樣有問(wèn)題嗎?
|
|
單帖管理 | 引用 | 回復(fù) |
lqk |
6樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2009-9-4 9:22:00 [只看該作者]
你的同步是不是在解析線程解析數(shù)據(jù)時(shí),接收線程就不能向ArrayList添加數(shù)據(jù)了.我覺(jué)得這是根你兩個(gè)線程的配合有關(guān)系。
|
單帖管理 | 引用 | 回復(fù) |
linman |
7樓 |
Post By:2009-9-4 9:49:00 [只看該作者]
對(duì),解析時(shí)不能添加,添加時(shí)解析也不能訪問(wèn),就是兩個(gè)線程在使用buffer時(shí)都先waitone(),使用后再ReleaseMutex(),請(qǐng)教應(yīng)該怎么配合呢
|
|
單帖管理 | 引用 | 回復(fù) |
lqk |
8樓 信息 | 搜索 | 郵箱 |
加好友 發(fā)短信 |
Post By:2009-9-4 10:49:00 [只看該作者]
數(shù)據(jù)接收線程: 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; } 數(shù)據(jù)解析線程:     while( m_bufGetIdx != m_bufPutIdx )     {         memcpy( buf, ReceiveBuf[m_bufGetIdx], i );         //數(shù)據(jù)解析         m_bufGetIdx = (m_bufGetIdx+1) % BUF_MAX;     } 兩線程不需要同步 |
單帖管理 | 引用 | 回復(fù) |
linman |
9樓 |
Post By:2009-9-4 13:24:00 [只看該作者]
謝謝您的回復(fù) ,主要我不明白為什么會(huì)發(fā)生這種現(xiàn)象?用環(huán)形為什么就能解決?另外,C#的話(huà)我要怎么構(gòu)造呢?
|
|
單帖管理 | 引用 | 回復(fù) |
linman |
10樓 |
Post By:2009-9-4 13:43:00 [只看該作者]
是否需要一個(gè)標(biāo)志用于同步兩個(gè)線程,是因?yàn)闆](méi)有做這個(gè)同步處理才導(dǎo)致發(fā)生這種現(xiàn)象嗎?
|
|
單帖管理 | 引用 | 回復(fù) |
qjh2008 |
11樓 |
Post By:2009-9-8 14:54:00 [只看該作者]
使用serialport控件很好用的
|
|
單帖管理 | 引用 | 回復(fù) |
zhl |
12樓 |
Post By:2009-9-8 16:48:00 [只看該作者]
兩個(gè)不同的線程使用了一個(gè)數(shù)據(jù)區(qū),應(yīng)用程序中是需要加以保護(hù)的。
|
|
單帖管理 | 引用 | 回復(fù) |