采集数据和处理数据如何同时进行

xkd722786 2016-08-02 04:39:16
问题描述:程序有2个部分,一个部分用采集卡实时采集数据,每50ms采集float[2150400],采集卡不间断采集;另一个部分负责数据处理,每次处理float[2150400]个数据,每次处理的时间小于采集的时间,处理模块不能够打断采集。请大神告知该用什么方法?
...全文
569 25 打赏 收藏 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2016-08-15
  • 打赏
  • 举报
回复
不知道你在就纠结什么?采集是采集,处理是处理。什么叫做 “对一个每秒转1圈的东西进行角度采集,如果采集间断10ms,那么就会错位3.6°,并且随着采集进行,误差会积累” 难道你处理的时候,就是把采集停了,然后处理??处理完了再启动采集???
xkd722786 2016-08-15
  • 打赏
  • 举报
回复
自顶,自顶,自顶
wanghui0380 2016-08-15
  • 打赏
  • 举报
回复
ok,别的俺们也不多说了 来看这个http://www.cnblogs.com/haoxinyue/archive/2013/03/01/2938959.html 你能先把你的数据处理逻辑,跟这文章一样用图画出来么??你画出来在说把
xkd722786 2016-08-14
  • 打赏
  • 举报
回复
引用 20 楼 From_TaiWan 的回复:
[quote=引用 16 楼 xkd722786 的回复:] [quote=引用 14 楼 zj_zwl 的回复:] sp1234 是高屋建瓴地阐述了多线程的概念。 按我的理解,针对楼主的情况(处理的时间小于采集的时间)用一个线程专门处理数据就可以了,事情真有那么复杂吗?
处理是其次,重要的是采集过程中不能有间断,如果采集中产生10ms的间断,那么数据就会错位。进队列也是要耗时的吧[/quote]10ms间断,就会出现错位?看来大家并没有理解你的需求,你举例说明下,错位会是什么样子的[/quote] 对一个每秒转1圈的东西进行角度采集,如果采集间断10ms,那么就会错位3.6°,并且随着采集进行,误差会积累。
xkd722786 2016-08-14
  • 打赏
  • 举报
回复
采集和处理可以同时进行,但是数据量太大,采集9次就报错了。
Multi_start((uint)CardHandle, 21504000, data, 21504000);这个函数是采集了一个21504000的一维数组,但是采集9次就报错了,内存满了。
private void Multi_start()
{
for (int j = 0; j < 40; j++)
{
long count = 0, count1 = 0, count2 = 0;
QueryPerformanceFrequency(ref count);
QueryPerformanceCounter(ref count1);
float[] data = new float[21504000];
Multi_start((uint)CardHandle, 21504000, data, 21504000);
data1.Enqueue(data);
QueryPerformanceCounter(ref count2);
double result = ((double)count2 - (double)count1) / (double)count;
textBox1.Text = result.ToString();
}
}
秋的红果实 2016-08-05
  • 打赏
  • 举报
回复
引用 16 楼 xkd722786 的回复:
[quote=引用 14 楼 zj_zwl 的回复:] sp1234 是高屋建瓴地阐述了多线程的概念。 按我的理解,针对楼主的情况(处理的时间小于采集的时间)用一个线程专门处理数据就可以了,事情真有那么复杂吗?
处理是其次,重要的是采集过程中不能有间断,如果采集中产生10ms的间断,那么数据就会错位。进队列也是要耗时的吧[/quote]10ms间断,就会出现错位?看来大家并没有理解你的需求,你举例说明下,错位会是什么样子的
烟波钓 2016-08-05
  • 打赏
  • 举报
回复
引用 17 楼 xkd722786 的回复:
[quote=引用 6 楼 ACMAIN_CHM 的回复:] 采集模块把数据放入队列, 然后处理模块线程从队列取数据处理。
数据进队列需要时间吧,如果耗时较大,在进行下一次采集时,这个时间间隔就会产生数据的位置误差。[/quote] 采集是一个动作,采集完后采集的资源就可以释放,通过发布事件或者其他方式把采集到的数据发布出去就ok了,然后采集的资源释放,等待下一次采集 至于数据,你可以在你的响应事件里面加入队列,存库等,甚至直接处理去,这就跟你的业务有关系了 两次数据之间是否有关系,等等 按照你的思路 采集对实时性要求很高,那就先保证,后续的处理可以异步 设置开多个线程或者服务器去处理,最朴素的分布式任务系统
秋的红果实 2016-08-04
  • 打赏
  • 举报
回复
受教了,受教了
zj_zwl 2016-08-04
  • 打赏
  • 举报
回复
sp1234 是高屋建瓴地阐述了多线程的概念。 按我的理解,针对楼主的情况(处理的时间小于采集的时间)用一个线程专门处理数据就可以了,事情真有那么复杂吗?
  • 打赏
  • 举报
回复
嗯,这里只是编程设计逻辑,没有涉及底层操作系统。 windows 操作系统是为了桌面和企业应用服务器而设计的通用系统,并不是简单的专用操作系统,用它来处理专用的数据控制系统功能,肯定会慢10倍速度(假设你的编程设计逻辑是正确的话)。如果你要专门只做你的工作,那么你应该选择比较简单底层的专用操作系统,同时又能比较好地支持线程调度的操作系统。
秋的红果实 2016-08-04
  • 打赏
  • 举报
回复
sp1234大哥,两个线程是独立运行的,但是队列有“缓存”的功能啊,当采集速度大于处理速度(入队快于出队),多出来的元素会存储到队列的;相反,若采集速度慢了,供不上处理,那就让处理线程空跑一趟,一直循环等到有数据 while (q.Count > 0 || 连续空闲时间<阀值) { if(q.Count > 0) { 处理数据; 出队; } else { 重新计算“连续空闲时间” } } 用委托的beginInvoke实现两个线程异步执行,解决线程安全问题 您说,这样也不行吗?
小程序员 2016-08-04
  • 打赏
  • 举报
回复
你 查下生产者消费者模式,很适合你这种情况。
  • 打赏
  • 举报
回复
如果你整个思路是往“两个独立执行的循环逻辑”里边去硬套,那么你就把自己限制在一个“井”里而研究天象,你的天花板就在于此。此时实际上你就只能适合极简单的工作。 实际上多线程并发处理的流程,线程数是不固定的。根本不受什么“两个部分、两个队列”的干扰。假设说世界上的人有5种,难道你以为世界上的人就都排成5个队列去生活而不是各自独立地生活吗?
  • 打赏
  • 举报
回复
如果你满脑子就是“两个死循环”的逻辑思维方式,那么无法真正把“异步、并行”处理设计到位。 在处理过程中,系统中可能有1个线程,也可能有10个线程,完全是动态根据需求而变的。所谓的“两个队列、两个线程”其实都是拉低了线程程序设计的水平,如果不是受到一些极老的 java 编程垃圾理论书籍的影响,那就是没有花过一次时间来仔细分析过.net 程序模型。 假设采集数据是连续快速的,比如说按照顺序a、b、c.......的事件触发方式连续处理,为了不阻塞 I/O 线程,那么采用“异步、工作子线程”方式来解析处理数据,于是按照 a1、b1、c1......这样的循序产生了 Thread 对象,或者是向“系统线程池”中注册了任务(由系统线程池来动态优化线程调度)。那么显然,这些a1、b1、c1......的结束时间并不是顺序的,有可能在a1结束了之后b1才结束,也有可能在b1结束了之后a1才结束,也有可能是b1、a1几乎同时结束。 因此系统中有1个线程、2个线程、10个线程,都是不定数目的。 而那种以为系统设计中有固定两个线程的想法,出发点是什么呢?是不是故意拉低、阻塞线程应用技术呢? 你学习编程时不可能刚学会了编程第二节课就以为自己“学完了、可以出师了”,就跑出去找工作去了。那种混乱的“队列”概念也是如此,是最低级的刚刚知道“2个线程的例子”就遇到天花板了。实际上真正的多线程并发程序设计,并不知道是有固定的几个线程在运行(系统线程池机制会自动优化并发数量),这才是真正的多线程编程设计的结果。
by_封爱 版主 2016-08-04
  • 打赏
  • 举报
回复
一个个说的这么厉害.. 不就是2个timer么...
巴士上的邂逅 2016-08-04
  • 打赏
  • 举报
回复
大家说的你都试了吗?出现问题了吗?
xkd722786 2016-08-04
  • 打赏
  • 举报
回复
引用 6 楼 ACMAIN_CHM 的回复:
采集模块把数据放入队列, 然后处理模块线程从队列取数据处理。
数据进队列需要时间吧,如果耗时较大,在进行下一次采集时,这个时间间隔就会产生数据的位置误差。
xkd722786 2016-08-04
  • 打赏
  • 举报
回复
引用 14 楼 zj_zwl 的回复:
sp1234 是高屋建瓴地阐述了多线程的概念。 按我的理解,针对楼主的情况(处理的时间小于采集的时间)用一个线程专门处理数据就可以了,事情真有那么复杂吗?
处理是其次,重要的是采集过程中不能有间断,如果采集中产生10ms的间断,那么数据就会错位。进队列也是要耗时的吧
xian_wwq 2016-08-03
  • 打赏
  • 举报
回复
引用 楼主 xkd722786 的回复:
问题描述:程序有2个部分,一个部分用采集卡实时采集数据,每50ms采集float[2150400],采集卡不间断采集;另一个部分负责数据处理,每次处理float[2150400]个数据,每次处理的时间小于采集的时间,处理模块不能够打断采集。请大神告知该用什么方法?
数据接收和处理异步化 最简单的方法是使用线程安全的队列, 采集线程将数据写入队列,返回; 如数据没有时序关联,启用线程池对数据进行解析
threenewbee 2016-08-03
  • 打赏
  • 举报
回复
出于保证采集的考虑,建议分为两个程序。
加载更多回复(5)

111,128

社区成员

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

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

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