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

2016-02-19 12:34 0 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,首先点击“启动写线程”然后点击“启动读线程 ”程序在退出之前点击“结束写线程“就可观察到执行效果。

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

延伸阅读
代码如下: package cn.me.test; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; /**  * 多线程下载  * 1:使用RandomAccessFile在任意的位置写入数据。  * 2:需要计算第一个线程下载的数据量,可以平均分配。如果不够平均时,  *&n...
标签: windows 操作系统
网上最流行的多线程下载文件当然是网际快车了,用它下载文件不但速度快,而且还可以断点续传。那么IE能不能采用多线程下载文件呢?当然可以,下面就一步一步地教你如何改变自己的IE吧。 第一步,用网际快车下载IE6.0SP1完整安装程序,并安装。如果是XP的系统或已经安装IE6.0的就跳过这一步。因为只有IE6.0支持多线程下载,所以系统中...
一、简介 1、什么是线程 要说线程,就必须先说说进程,进程就是程序的运行时的一个实例。线程呢可以看作单独地占有CPU时间来执行相应的代码的。对早期的计算机(如DOS)而言,线程既是进程,进程既是进程,因为她是单线程的。当然一个程序可以是多线程的,多线程的各个线程看上去像是并行地独自完成各自的工作,就像一台一台计算机上运行着...
标签: Delphi
  { 这里的多线程同步查询演示程序仅包括一个工程文件和一个单元文件 } { 窗体中放置的组件有: } { 两个Session组件 } { 两个Database组件 } { 两个Query组件 } { 两个DataSource组件 } { 两个DBGrid组件 } { 一个Button组件 } { 除非特别说明,否则上述各组件的属性都取默认值(见各组件注释...
标签: 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...

经验教程

33

收藏

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