MFC工控项目实例二十八模拟量信号每秒采集100次

用两个多媒体定时器,一个定时0.1秒计时,另一个定时0.01秒用来对模拟量信号采集每秒100次。
1、在SEAL_PRESSUREDlg.h中添加代码

class CSEAL_PRESSUREDlg : public CDialo
{
public:
	CSEAL_PRESSUREDlg(CWnd* pParent = NULL);	// standard constructor
	...
    UINT timerID;//自己添加的定时器ID变量	
	void DestroyTimer();//自己声明的销毁定时器函数
	UINT CreateTimer();//自己声明的创建定时器函数
	void OnTimer_1(UINT nIDEvent_1);
    static void CALLBACK TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);//定时器回调函数
    int t_time;

	UINT timerID_2;//自己添加的定时器ID变量	
	void DestroyTimer_2();//自己声明的销毁定时器函数
	UINT CreateTimer_2();//自己声明的创建定时器函数
	void OnTimer_2(UINT nIDEvent_2);
    static void CALLBACK TimeProc_2(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);//定时器回调函数
   double  t_time_2;
   ...
   }

2、在SEAL_PRESSUREDlg.cpp中添加代码

void CSEAL_PRESSUREDlg::OnTesStart() 
{
	if (m_isStop)
		{
			m_TES_START.SetIcon(IDI_TES_START); 
        m_TES_START.SetAlign(CButtonST::ST_ALIGN_VERT);
		((CButton *)GetDlgItem(IDC_TES_START))->SetWindowText(m_isStop ? "结束测试" : "开始测试");			
		DestroyTimer();
		DestroyTimer_2();
         m_isStop=0;
		}
		    else
			{ 
			 
        	t_time=0;
			t_time_2=0.0;
		    m_TES_START.SetIcon(IDI_TES_STOP); 
            m_TES_START.SetAlign(CButtonST::ST_ALIGN_VERT);
		   ((CButton *)GetDlgItem(IDC_TES_START))->SetWindowText(m_isStop ? "结束测试" : "开始测试");
		   //	CTime m_time; 		
		   //   m_time=CTime::GetCurrentTime();             //获取当前时间日期
           //   CString   m_strDateTime=m_time.Format(_T("%Y-%m-%d %H:%M:%S %A"));   //格式化日期时间
           //  CString   str=m_time.Format("%Y_%m_%d ");   //格式化日期时间
           //	theApp.time_name=theApp.typ_name+"\\"+str+"\\";         

	SYSTEMTIME SystemTime;
	::GetLocalTime(&SystemTime);
	CString str1="",Date="";
	str1.Format("%02d",SystemTime.wYear);
	Date = Date + str1;
	str1.Format("_%02d",SystemTime.wMonth);
	Date = Date + str1;
	str1.Format("_%02d",SystemTime.wDay);
	Date = Date + str1;
//	str1.Format("_%02d",SystemTime.wHour);
//	Date = Date + str1;
//	str.Format("_%02d",SystemTime.wMinute);
//	Date = Date + str1;
//	str.Format("_%02d",SystemTime.wSecond);
//	Date = Date + str1;     
   theApp.time_name=theApp.typ_name+Date+"\\";
   	if (!PathIsDirectory(theApp.time_name)) //目录不存在
					{ 
	                //	MessageBox("文件不存在");
	                    CreateDirectory(theApp.time_name, FALSE);//不存在则创建
						cre_data();
					}
                    else //目录存在
					{
                 //	MessageBox("文件存在");
					cre_data();
					}
   
   SetDlgItemText(IDC_STATIC99,theApp.time_name);

		   	CreateTimer();	  
	    	CreateTimer_2();	  
	        m_isStop=1;
			}
   

}


UINT CSEAL_PRESSUREDlg::CreateTimer()
{
	timeBeginPeriod(1);//设置定时器设备的最小时间分辨率
	timerID = timeSetEvent(100, 1, TimeProc, (DWORD)this, TIME_PERIODIC);

	return timerID;//返回定时器ID

// timeSetEvent(UINT uDelay, UINT uResolution, LPTIMECALLBACK IP TimeProc, DWORD_PTR dwUser, UINT fuEvent);
//创建并初始化定时器事件,定时器回调函数入口地址
//uDelay:定时器触发时间间隔,以毫秒为单位
//uResolution:定时器设备精度,以毫秒为单位,,默认为1ms
//LpTimeProc:定时器出发时间的回调函数的地址
//dwUser:传递给回调函数的数据
//fuEvent:定时类型,TIME_ONSHOT表示uDelay毫秒后只产生一次事件,TIME_PERIOFIC表示每隔uDelay毫秒周期性的产生事件

}

void CALLBACK CSEAL_PRESSUREDlg::TimeProc(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	CSEAL_PRESSUREDlg* time_dlg = (CSEAL_PRESSUREDlg*)dwUser;
	time_dlg->OnTimer_1(1);
 //uID:多媒体定时器的ID,ID值由timeSetEvent创建定时器事件时返回
 //uMsg:保留 不使用
 //dwUser:由timeSetEvent传递的用户数据
 //dw1,dw2:保留 不使用
}

void CSEAL_PRESSUREDlg::OnTimer_1(UINT nIDEvent_1)
{
        if (nIDEvent_1==1 && t_time<=theApp.m_sys_data.m_fMaxTime*10)
		{
           t_time++;
           CString str_t2_6,str_t2_5,str_t2_4,str_t2_3,str_t2_2,str_t2_1;
		   int	 t2=t_time;		   	   
		   str_t2_5.Format("%d",t2%10);
		   str_t2_4.Format("%d",(t2/10)%10);
		   str_t2_3.Format("%d",(t2/100)%10);
		   str_t2_2.Format("%d",(t2/1000)%10);
		   str_t2_1.Format("%d",(t2/10000)%10);		  
           SetDlgItemText(IDC_STATIC4,str_t2_5);
           SetDlgItemText(IDC_STATIC3,".");
		   SetDlgItemText(IDC_STATIC2,str_t2_4);		 
		   SetDlgItemText(IDC_STATIC1,str_t2_3);
		   SetDlgItemText(IDC_STATIC0,str_t2_2);
		}
		 
}

void CSEAL_PRESSUREDlg::DestroyTimer()
{
	timeKillEvent(timerID);//销毁定时器
	timeEndPeriod(1);//清除上次调用 timeBeginPeriod 函数时指定的最小计时器分辨率
}


UINT CSEAL_PRESSUREDlg::CreateTimer_2()
{
	timeBeginPeriod(1);//设置定时器设备的最小时间分辨率
	timerID_2 = timeSetEvent(10, 1, TimeProc_2, (DWORD)this, TIME_PERIODIC);
	return timerID_2;//返回定时器ID

}

void CALLBACK CSEAL_PRESSUREDlg::TimeProc_2(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
	CSEAL_PRESSUREDlg* time_dlg_2 = (CSEAL_PRESSUREDlg*)dwUser;
	time_dlg_2->OnTimer_2(2);
 }

void CSEAL_PRESSUREDlg::OnTimer_2(UINT nIDEvent_2)
{           
		   if (nIDEvent_2==2 && t_time<=theApp.m_sys_data.m_fMaxTime*10)
		{
		     t_time_2++;
			double YRandom;//随机数

                   YRandom = rand()%5; // Generate Random data  
                    m_ctrlPlot_1.GetChannel(0).AddXY(t_time_2/100, YRandom );
		}          
		 
}


void CSEAL_PRESSUREDlg::DestroyTimer_2()
{
	timeKillEvent(timerID_2);//销毁定时器
	timeEndPeriod(1);//清除上次调用 timeBeginPeriod 函数时指定的最小计时器分辨率
}

运行程序点击开始试验
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907481.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用插值公式实现滚动进度条动画效果

我们在日常前端开发时在动画的选择上基本都是css&#xff0c;通过css的animation即可满足大部分的开发场景&#xff0c;如果遇到了特殊而比较不容易实现的效果就会考虑到用js来实现&#xff0c;而本次的主题&#xff0c;就是围绕用js来做一个比较不常见的特殊动画效果。 假设我…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第4天,注册登录逻辑代码

24.11.03 1.输入手机号跳转功能 第一个要设计的功能是&#xff0c;输入手机号以后跳转到另一个页面&#xff0c;输入获取得到的验证码页面。先拿这个功能练练手。 首先看一下此时的完整项目结构&#xff1a; 主要是添加了2个活动类和对应的界面&#xff0c;下面看详细的代码…

ubuntu【桌面】 配置NAT模式固定IP

DHCP分配导致虚拟机IP老变&#xff0c;SSH老要重新配置&#xff0c;设成静态方便些 一、设NAT模式 1、设为NAT模式 2、看模式对应的虚拟网卡 - VMnet8 3、共享主机网卡网络到虚拟网卡 - VMnet8 二、为虚拟网卡设置静态IP 记住这个IP 三、设置ubuntu固定IP 1、关闭DHCP并…

数智驱动,纷享销客助力万东医疗实现精细化管理

数字化浪潮正在席卷整个医疗影像行业&#xff0c;数字化工具对疾病诊疗效率和诊疗质量的提升也有目共睹。北京万东医疗科技股份有限公司&#xff08;以下简称“万东医疗”&#xff0c;股票代码 600055&#xff09;成立于1955年&#xff0c;1997 年在上海证交所上市&#xff0c;…

项目模块十四:HttpRequest模块

一、项目设计思路 存储HTTP请求要素&#xff0c;提供简单接口 二、成员变量 全部公有 string _method; // 请求方法 string _path; // 资源路径 string _version; // 协议版本 string _body; // 请求正文 smatch _matches; // 资源路径正则提取 …

[HNCTF 2022 Week1]calc_jail_beginner_level3(JAIL)

开启靶场&#xff0c;打开链接&#xff0c;下载附件&#xff1a; 嗯&#xff0c;直接显示“Oh hacker!”&#xff0c;有点懵&#xff0c;先看看下载的附件&#xff08;server.py&#xff09;&#xff1a; 得到信息如下&#xff1a; 用户输入的表达式长度被限制在7个字符以内。…

最短路的求解

实验类型&#xff1a;◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的&#xff1a;学会使用Matlab求解最短路。 实验内容&#xff1a;1.熟练运用Floyd算法&#xff1b;2. 熟练运用Dijkstra算法&#xff1b;3.利用Matlab编程实现最短路的计算。 例1&#xff1a;已知无向图…

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8

目前最新最好用 NET 混淆工具 .NET Reactor V6.9.8 1、.NET Reactor V6.9.8 功能简介2、官方下载 1、.NET Reactor V6.9.8 功能简介 业界领先的源代码保护 .NET Reactor通过多种方法来防止反编译&#xff0c;这些方法会将 .NET 程序集转换为任何现有工具都无法反编译的进程。…

为啥学习数据结构和算法

基础知识就像是一座大楼的地基&#xff0c;它决定了我们的技术高度。而要想快速做出点事情&#xff0c;前提条件一定是基础能力过硬&#xff0c;“内功”要到位。 想要通关大厂面试&#xff0c;千万别让数据结构和算法拖了后腿 我们学任何知识都是为了“用”的&#xff0c;是为…

Ubuntu 24.04上启用 root 用户通过 SSH 和图形界面进行登录

一、启用 root 用户的密码登录 设置 root 用户密码&#xff1a; 在终端中输入以下命令为 root 用户设置一个密码&#xff1a; testtest-virtual-machine:~$ sudo passwd root [sudo] test 的密码&#xff1a; 新的密码&#xff1a; 无效的密码&#xff1a; 密码是一个回文…

卡尔曼滤波器-Kalmen Filter-1

卡尔曼滤波器是一种最优递归数据处理算法&#xff0c;它更像是一种观测器&#xff0c;而不是一般意义上的滤波器。卡曼滤波器的应用非常广泛&#xff0c;尤其是在导航当中。它的广泛应用是因为我们生活的世界中存在着大量的不确定性&#xff0c;当我们去描述一个系统的时候&…

C++ | Leetcode C++题解之第519题随机翻转矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:Solution(int m, int n) {this->m m;this->n n;this->total m * n;srand(time(nullptr));}vector<int> flip() {int x rand() % total;vector<int> ans;total--; // 查找位置 x 对应的…

电子电气架构 --- 车载诊断的快速入门

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

【云备份项目】json以及jsoncpp库的使用

目录 1.JSON 2.什么是 JSON&#xff1f; 3.JSON 发展史 4.为什么要使用 JSON&#xff1f; 5.JSON 的不足 6.JSON 应该如何存储&#xff1f; 7.什么时候会使用 JSON 7.1.定义接口 7.2.序列化 7.3.生成 Token 7.4.配置文件 8.JSON的语法规则 8.1.对象和数组 8.2.JS…

DNS服务部署

DNS服务部署 1.要求 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 2.配置 主服务器&#xff1a; 1.安装BIND [rootlocalhost xzy]# sudo dnf install bind bind-utils2.配置正向区域 [roo…

Python酷库之旅-第三方库Pandas(191)

目录 一、用法精讲 886、pandas.Index.repeat方法 886-1、语法 886-2、参数 886-3、功能 886-4、返回值 886-5、说明 886-6、用法 886-6-1、数据准备 886-6-2、代码示例 886-6-3、结果输出 887、pandas.Index.where方法 887-1、语法 887-2、参数 887-3、功能 8…

【C++】类和对象(十二):实现日期类

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的实现日期类&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1 /!/>/</>/<运算符重载2 /-//-运算符重载(A) 先写&#xff0c;再通过写(B…

免费送源码:Java+Springboot+MySQL Springboot酒店客房管理系统的设计与实现 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对酒店客房管理等问题&#xff0c;对酒店客房…

无线配置实验

配置 sw1 [sw1]vlan batch 10 20 100 [sw1-GigabitEthernet0/0/1]port link-type trunk [sw1-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 100 [sw1-GigabitEthernet0/0/1]port trunk pvid vlan 100 接口g124一样的配置 [sw1-GigabitEthernet0/0/3]port link-type…

在基于AWS EC2的云端k8s环境中 搭建开发基础设施

中间件下载使用helm,这里部署的都是单机版的 aws-ebs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:name: aws-ebs-storageclass provisioner: kubernetes.io/aws-ebs parameters:type: gp2 # 选择合适的 EBS 类型&#xff0c;如 gp2、io1…