怎样从双缓存中取出数据

visuaL_world 2009-08-20 11:58:02
大家好!我使用双缓存进行数据采集,两个缓存相同大小。采集程序一开始运行,首先将采集的数据放入第一个缓存,当这个缓存区满了之后,就会触发OnFirstHalfBulkDataReady()这个事件,然后就会开始向第二个缓存放入数据,当第二个缓存满了之后,就会调用OnSecondHalfBulkDataReady()这个事件。在向第二个缓存放数据的时候,从第一个缓存中取出数据。同样,在向第一个缓存区放入数据的时候,从第二个缓存中取数据。就这样不断循环下去就可以实现不间断的海量数据采集。我现在想把缓存中的数据全部取出来放到内存中做处理,也就是把这些数据都放到一个数组里,想问一下怎么实现?下面的代码是数据采集卡公司提供的相关例子。就想在下面代码的基础上做点修改实现就可以了。我自己改了一下,但发现有问题,所以希望大家指教!

private void axAICtrl_OnFirstHalfBulkDataReady(object sender,AxAdvAILib._IAdvAIEvents_OnFirstHalfBulkDataReadyEvent e) {
long dataCount = e.dataCount;// 取出缓存区中数据个数
object digitalArray = e.digitalArray;//取数字量
object analogArray = e.analogArray;//取模拟量
long i;
frmDisp.Status.Text="LowHalf";

frmDisp.lstRawData.Items.Clear();
frmDisp.lstVoltage.Items.Clear();

try
{
if ( digitalArray!= null )
{
short[] rawData ;
rawData = (short[]) digitalArray;
for( i=0 ; i< axAICtrl.ChannelScanCount ; i++ )
{
frmDisp.lstRawData.Items.Add( rawData[i] );

}
}
if ( analogArray != null)
{
float[] voltage;
voltage = (float[]) analogArray;
for( i=0 ; i<axAICtrl.ChannelScanCount ; i++ )
{
frmDisp.lstVoltage.Items.Add( voltage[i] );
}
}
}
catch ( Exception err )
{
cmdStart.Enabled=true;
cmdStop.Enabled=false;
MessageBox.Show( err.Message );

}
}

private void axAICtrl_OnSecondHalfBulkDataReady(object sender, AxAdvAILib._IAdvAIEvents_OnSecondHalfBulkDataReadyEvent e) {
long dataCount = e.dataCount;
object digitalArray = e.digitalArray;
object analogArray = e.analogArray;
long i;
frmDisp.Status.Text="HighHalf";
frmDisp.lstRawData.Items.Clear();
frmDisp.lstVoltage.Items.Clear();

try
{

if ( digitalArray != null)
{
short[] rawData ;
rawData = (short[]) digitalArray;
for( i=0 ; i< axAICtrl.ChannelScanCount ; i++ )
{
frmDisp.lstRawData.Items.Add( rawData[i] );

}
}
if ( analogArray!= null )
{
float[] voltage;
voltage = (float[]) analogArray;
for( i=0 ; i< axAICtrl.ChannelScanCount ; i++ )
{
frmDisp.lstVoltage.Items.Add( voltage[i] );
}
}
}
catch ( Exception err )
{
cmdStart.Enabled=true;
cmdStop.Enabled=false;
MessageBox.Show( err.Message );

}
}
注:在程序界面上设定取出模拟量,所以digitalArray = null,不用管digitalArray 部分。
...全文
208 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cynthia919 2009-09-10
  • 打赏
  • 举报
回复
我也正好在用研华的卡做数据采集的项目,运行中遇到问题上网搜,搜到这里来了。

我用的是ArrayList.Add()方法,将每次采集到的digitalArray数组元素一个个加到 ArrayList中去,这样在停止采集前都没有问题,前半满和后半满都要加到同一个ArrayList中去。在需要的时候,把这个ArrayList转成数组就行了^^

这是我第一次做项目,不知道这样的方法合不合理
但是我运行的时候有的时候会在AdvAILib.AcquireBulkDataToMemory()这个地方出现“尝试读取或写入受保护的内存这通常指示其他内存已损坏”这样的问题,不知道是研华组件的问题还是我程序的问题,于是上网来搜来了,可是都搜不到什么,望高人指点>.<
guyehanxinlei 2009-08-21
  • 打赏
  • 举报
回复
友情帮顶..
zlkingdom 2009-08-21
  • 打赏
  • 举报
回复
这个有难度,学习帖
whyabc 2009-08-20
  • 打赏
  • 举报
回复
看不懂,帮顶
微创社(MCC) 2009-08-20
  • 打赏
  • 举报
回复
MARK
ztenv 2009-08-20
  • 打赏
  • 举报
回复
同步,互斥。。。。
bigmingming 2009-08-20
  • 打赏
  • 举报
回复
可以参考PV操作

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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