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

热情的平安之路

热情的平安之路

2016-02-19 12:34

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

  下面我将对这两个问题和大家一起探讨一下。相信大家对生产者消费者问题并不生疏。在读书的时候我们采用系统体提供的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,首先点击“启动写线程”然后点击“启动读线程 ”程序在退出之前点击“结束写线程“就可观察到执行效果。
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
使用多线程实现数据实时采集

VC++6.0实现视频数据实时获取的探讨

编程语言 网络编程
VC++6.0实现视频数据实时获取的探讨

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java多线程编程精要之实现线程

Java JAVA基础
Java多线程编程精要之实现线程

JavaScript多线程的实现方法

Web开发
JavaScript多线程的实现方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

浅析php中实现多线程

PHP
浅析php中实现多线程

在IOS中为什么使用多线程及多线程实现的三种方法

编程语言 网络编程
在IOS中为什么使用多线程及多线程实现的三种方法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

实例解析C++/CLI之值类型

实例解析C++/CLI之值类型

C语言:黑客学员必修课(二)

C语言:黑客学员必修课(二)
下拉加载更多内容 ↓