美国国家仪器公司为用户提供了许多高性能、高速度、高分辨率的数据采集卡,而与之接口的软件大多采用

Labview,Labview是一种图形化编程软件,你只需拖动控件到容器,使用起来确实比较方便。但用户无法知

道底层的东西,这样针对具体的应用,还要自己去理解封装得很深的函数或程序,费时、费力。因此,

c++/MFC还是一种

比较好的选择。如何在MFC中实现实时数据采集呢? 首先,得有定时器,定时器在指定的时间内向窗口发送

WM_TIMER消息,用户在消息处理函数里面完成数据采集和直观的图形或数值实现。设置定时器很简单,只需

简单的调用Settimer(1,100,NULL),消息映射为OnTimer()函数。但实际上,大型的程序设计一般不会采用

这样的方法,而是把数据采集和图形显示放到一个DLL里面,

,但如何在采集完数据后,发消息给视图类,以便视图类把数据以需要的格式显示出来,

曾经尝试发送用户自定义消息,但发现在视图类接收不到该用户自定义消息。因此,眼前要解决的问题关键

在于文档对象需要定时连续地采集数据,然后通知多个视图类以不的格式处理和显示这些数据。在文档要实

现有规律连续数据采集,需要有个定时器事件。

定时器事件通常通过调用UINT SetTimer(
  HWND
 hWnd,              // handle of window for timer messages
  UINT nIDEvent,          // timer identifier
  UINT uElapse,           // time-out value
  TIMERPROC lpTimerFunc   // address of timer procedure
);函数来实现,

其中, hWnd是与定时器相关联的窗口句柄,此窗口为调用线程所拥有。nIDEvent是定时器标志符,也就是

标识定时器的唯一性,如果要定义多个定时器,就需要用这个参数来区别该定时器。 uElapse是指隔多长时

间来执行后面的第四个参数所指向的函数,lpTimerFunc 是uElapse流逝后系统再次调用的函数的指针。

在我们对这个API函数有些认识,如要设计一个时间间隔为100毫秒的定时器事件,如SetTimer

(NULL,1,100,lpTimerFunc); 第一个参数为NULL是指没有与定时器相关联的窗口,因而第二个参数也被忽略

了,也意味着在没有窗口的文档类中,不可以实现多个定时器.

回调函数说明如下,VOID CALLBACK TimerProc(
  HWND
 hwnd,     // handle of window for timer messages
  UINT uMsg,     // WM_TIMER message
  UINT idEvent // timer identifier
  DWORD dwTime   // current system time
);

该Windows 定时器是IBM PC硬件和ROM BIOS构造的定时器的简单扩充。计算机的ROM初始化8523定时器使

其产生硬件中断08H,而该中断的频率为18.2Hz,即每隔54.9ms产生一次中断。也就是说该Windows定时器的

时间精度是54.9ms,基本上能满足数据采集的要求,因为计算机显示屏的刷新频率最快为50Hz-60Hz。

该定时器的优点是初始化简单,容易实现,然而缺点也显而易见,因为WM_TIMER消息的优先级比较低,只有

应用程序队列中的所有其他消息被处理完后,才能处理该WM_TIMER消息,不能保证数据采集的一致性。而且

定时器的分辨率不高,不能满足工业上日益增长德高精度的实时采集的需要。因此,这里提出了一种新的

多媒体定时器,该定时器的相关说明如下:

MMRESULT timeSetEvent( UINT uDelay,
                               UINT uResolution,
                               LPTIMECALLBACK lpTimeProc,
                               WORD dwUser,
                               UINT fuEvent )

该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数, 成功后返回事件的标识符代码,否则返回NULL。函数的参数说明如下:

 uDelay:以毫秒指定事件的周期。 Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。 LpTimeProc:指向一个回调函数。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay毫秒后只产生一次事件 TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件

 具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数 中(如:定时采样、控制等),

从而完成所需处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后, 应及时调用

timeKillEvent()将之释放。

多线程实时数据采集MFC VISUAL C++ /C++相关推荐

  1. PLC实时数据采集如何实现?

    数据采集传输对于后续企业进行分析和决策是十分重要的,而实时数据采集更能提升整体生产的认识度,从而采取到更加及时高效的措施.因此PLC实时数据采集成为企业的基础应用,那么如何实现PLC的实时数据采集呢? ...

  2. BUAA OO Unit2 多线程实时电梯系统

    基于Pipeline模式的架构设计 Pipeline 模式也称为流水线模式.将一个任务处理分解为若干个处理阶段,其中每个处理阶段的输出作为下一个处理阶段的输入,并且各个处理阶段都有相应的工作者线程去执 ...

  3. 实时数据采集与处理:如何从各种数据源中快速获取数据?

    作者:禅与计算机程序设计艺术 随着互联网.大数据.物联网等新兴技术的发展,越来越多的人们开始关注和使用基于这些技术的应用服务.其中,实时数据采集与处理(Real-Time Data Collectio ...

  4. rsync+sersync多线程实时同步

    一.sersync优点 1)使用c++编写,对linux系统文件产生的临时文件和重复文件操作会进行过滤,在结合rsync同步的时候,会减少运行时消耗的本地及网络资源,因此速度更快. 2)相比较inot ...

  5. 基于W5300和FPGA的实时数据采集系统设计

    (以下文章来自:http://xilinx.eetrend.com/article/4032) 数据采集是信号处理的前提,大量采样数据的实时传输十分重要.以太网由于传输速度快.传输距离远,可以方便地实 ...

  6. matlab研究,基于MATLAB的实时数据采集与分析研究

    1.引言本文引用地址:http://www.eepw.com.cn/article/163805.htm 数据采集系统涉及多学科,所研究的对象是物理或生物等各种非电或电信号.根据各种非电或电信号的特征 ...

  7. Mitsubishi (三菱) Fanuc(发那科),CNC,多线程网口数据采集

    1.话不多说,先看效果 三菱CNC Fanuc CNC 2.能采集的数据有如下: 产量,状态,轴负载,坐标,主轴转速,三个倍率(主轴倍率 进给倍率 快速倍率),进给速度,当前加工程序名/程序号,当前程 ...

  8. UVC 摄像头驱动(三)配置摄像头,实时数据采集

    前面分析了 UVC 摄像头的硬件模型和描述符,对于一个 usb 摄像头来说,内部大概分为一个 VC 接口和一个 VS 接口,VC 接口内部有许多 unit 和 terminal 用来"控制& ...

  9. pyqt5 多线程实时拉流并播放,画面流畅无卡顿

    目录 1. 背景 2. 实现 1. 背景 需要用pyqt5做一个简单播放器,能够连接单位摄像头,用rtsp拉流并实时展示.很多博客方法都试过,或者卡顿,或者时延较大,无法满足需求. 2. 实现 主要参 ...

  10. 极光实时监听怎么调用_源码分析 Sentinel 实时数据采集实现原理(图文并茂)

    本篇将重点关注 Sentienl 实时数据收集,即 Sentienl 具体是如何收集调用信息,以此来判断是否需要触发限流或熔断. Sentienl 实时数据收集的入口类为 StatisticSlot. ...

最新文章

  1. 如何将知识图谱特征学习应用到推荐系统?
  2. [译]ASP.NET Core 2.0 机密配置项
  3. centos 开发环境配置
  4. 码云怎么创建公开的仓库_使用码云或GitHub搭建简单的个人网站(补充hexo搭建博客)...
  5. 2021年北京学校高考成绩查询,2021年北京高考成绩查询时间及入口【官方】
  6. c语言判断输入类型是否为指定类型?
  7. Go语言详细介绍:logo和版本
  8. CCCC-GPLT L1-035. 情人节 团体程序设计天梯赛
  9. 机器学习算法之手撕SVM-线性(理论)
  10. sql server 2016新特性 查询存储(Query Store)的性能影响
  11. Codeforces Round #483 (Div. 1) A. Finite or not?
  12. iphone绕过id_破解苹果安卓手机屏幕锁ID锁 极品神器
  13. centos ping 路由_centos服务器怎么ping 命令
  14. netmeeting的使用(详解)
  15. 图书馆管理系统 3-概要设计
  16. 你知道哪些中国学生普遍生疏但意境很美的英语词汇?
  17. 医疗物联网七大应用场景案例解析
  18. java计算机毕业设计基于Web的上门家教系统的设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
  19. python怎么把照片转成卡通_python用OpenCV转卡通照片报错,好像是pyrdown的使用有问题?...
  20. OpenJudge_P7833 幂的末尾

热门文章

  1. 射频电路PCB的设计技巧 四大基础特性
  2. 8uftp,8uftp使用教程图解
  3. linux命令大全密码修改,linux修改密码命令
  4. mysql workbench修改密码_更改MySQL用户密码
  5. adb 黑域app_黑域使用教程 进入黑域app详细教程
  6. 《代码整洁之道》精读与演绎----毛星云
  7. 创建一个Scrapy爬虫项目并运行
  8. 【产品人卫朋】华为IPD流程体系:集成产品开发框架
  9. 家政服务微信小程序开发
  10. nginx集群部署,实现负载均衡和nfs共享