使用多线程实现数据实时采集

2016-02-19 12:34 6 1 收藏

下面图老师小编跟大家分享一个简单易学的使用多线程实现数据实时采集教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】


  下面我将对这两个问题和大家一起探讨一下。相信大家对生产者消费者问题并不生疏。在读书的时候我们采用系统体提供的p,v解决,这是对同一临界区资源同时进行读写需要的保护措施,本工程使用缓冲队列,故不需要对临界区进行加锁 。马上我会实现双缓存的版本。在此版本中我会实现对临界区的加减锁。  
  
  读取的数据要存储到相应的数据结构中,可以有很多种选择,比如存成任务缓冲队列(以链表实现)其中大部分工程使用循环队列用于一写多读,写线程将数据写入队列,读线程从队列中读取。或者实现双缓存方法,即写线程写满一个缓存读线程来取数据同时写线程将数据写入另一个缓存。  
  
  具体的实现如下:  
  
  链表的节点声明如下:  
  
  typedef strUCt NODE  
  
  {  
  
  int Buffer[MAX_BUFFER_SIZE];
  
  long Counters; 
  
  bool ReadEnable;  
  
  NODE * pNext; 
  
  }NODE; 
  
  其中数组Buffer[]用来存放采集数据。Counters用来描述有多少个读线程曾对节点进行访问。假如所有读线程都访问过此节点,即可将此节点删除!ReadEnable表示其节点是否可读。
  链表的声明如下: 
  
  typedef struct LIST 
  
  { 
  
  NODE * pReadPtr; 
  
  NODE * pWritePtr;  
  
  NODE * pHeadPtr; 
  
  }LIST;  
  
  其中pReadPtr为指向可读节点的指针,pWritePtr为指向可写节点的指针。其中pReadPtr在pWritePtr的后面,也就是写指针不能超过读指针。pHeadPtr指向链表中第一个节点的指针。 
  
  我使用一个写线程两个读线程,也可以实现两个以上的读线程。朋友们可以试一下只需要修改list中Counters就行了。 
  
  DWord WINAPI ReaderOne(void * pVoid); 
  
  DWORD WINAPI ReaderTwo(void * pVoid);  
  
  DWORD WINAPI WriterUnique(void * pVoid);   
  
  在WriterUnique我采用动态分配节点,同时模拟数据采集填充NODE的buffer数组。当然要对写线程进行加锁保护。在ReaderOne和ReaderTwo中对链表中的节点进行访问并显示在对话框中。  
  
  注重的问题:  
  
  1, 因为节点是动态分配内存,所以new之后一定要delete否则内存就会被程序慢慢吃掉 
  
  2,加锁之后一定要解锁否则就会引起死锁问题。  
  
  3,首先点击“启动写线程”然后点击“启动读线程 ”程序在退出之前点击“结束写线程“就可观察到执行效果。

来源:http://www.tulaoshi.com/n/20160219/1601189.html

延伸阅读
标签: Delphi
  { 这里的多线程同步查询演示程序仅包括一个工程文件和一个单元文件 } { 窗体中放置的组件有: } { 两个Session组件 } { 两个Database组件 } { 两个Query组件 } { 两个DataSource组件 } { 两个DBGrid组件 } { 一个Button组件 } { 除非特别说明,否则上述各组件的属性都取默认值(见各组件注释...
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的大型应用软件无一不是多线程多任务处理...
标签: Web开发
代码如下: //栏目 //发送ajax请求 $.getJSON( "../../../Templet/GetInfoHandler.ashx", //产生JSON数据的服务端页面 {id: "0", sid: "1;2;3", rid: Math.round(Math.random() * 10) }, //向服务器发出的查询字符串 //对返回的JSON数据进行处理 function(json) { //循环取json中的数据,并呈现在列表中 $("#column_0_1").empty(); va...
标签: Delphi
  优秀的数据库应用应当充分考虑数据库访问的速度问题。通常可以通过优化数据库、优化 查询语句、分页查询等途径收到明显的效果。即使是这样,也不可避免地会在查询时闪现一个带有 SQL符号的沙漏,即鼠标变成了查询等待。最可怜的是用户,他(她)在此时只能无奈地等待。遇到急性子的,干脆在此时尝试 Windows中的其它应用程序,...
在中小型电站系统就地控制中,比如水电站中如果我们要进行各种设备控制的话,串口数量就可能比较多了,有的地方加上载波甚至可以达到10个以上,很多的解决方法是将某些功能设备并行接到一个串口上面尽量减少串口的数量,然后进行数据采集的时候采取环的方法进行。但是工业控制要求实时性比较高,比如报警和各种控制,如果不能在尽可能短的...

经验教程

659

收藏

28
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部