QQ登录

只需一步,快速开始

实现微秒级精确定时功能--上位机VC

[ 复制链接 ]

实现微秒级精确定时功能--上位机VC

实现微秒级精确定时功能--上位机VC

实现微秒级精确定时功能--上位机VC
功能展示
在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位机定时向下位机发送命令和传送数据等。特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作。当前例程实现三种定时功能,其中包含微秒级精度定时方法,效果如图;点击不同按钮,例程都会执行一相同代码段,并计时代码执行时间,显示在列表框中
要点提示
在上位机软件编写时,可供选择的定时方法众多当前例程演示三种方法实现定时功能;
方法1是是通过 函数GetTickCount()实现。该函数的返回值是  DWORD型,表示以ms为单位的计算机启动后经历的时间间隔。精度比WM_TIMER消息映射高,在较 短的定时中其计时误差为15ms;

方法2是通过函数timeGetTime()实现,该函数定时精 度为ms级,返回从Windows启动开始经过的毫秒数。使用前须将 Winmm.lib  和 Mmsystem.h 添加到工程中。

方法3是通过QueryPerformanceFrequency() QueryPerformanceCounter()结合使用来实现。此方法精度最高;

在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经 历的精确时间。
实现功能
1.新建基于对话框的应用程序

2.拖拽一列表框控件ID保持默认IDC_LIST1,添加三按钮<定时方法1><定时方法2><定时方法3>关联点击函数,分别实现三种定时功能
  1. void CGkbc8Dlg::OnButton1()
  2. {
  3.         DWORD dwStart = GetTickCount();//开始时间
  4.         for (int i = 0; i < 10000; i++)
  5.         {
  6.                 for (int j = 0; j < 10000; j++)
  7.                 {
  8.                 }
  9.         }
  10.         DWORD dwStop = GetTickCount();//结束时间
  11.         DWORD dwElapse = dwStop - dwStart;//时间间隔
  12.         CString strText;
  13.         strText.Format(_T("代码执行时间:%d ms"), dwElapse);
  14.         CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
  15.         pList->InsertString(0,strText);
  16. }
  17. #include<Mmsystem.h >
  18. #pragma comment(lib,"Winmm.lib")
  19. void CGkbc8Dlg::OnButton2()
  20. {
  21.         DWORD dwStart = timeGetTime();//开始时间
  22.         for (int i = 0; i < 10000; i++)
  23.         {
  24.                 for (int j = 0; j < 10000; j++)
  25.                 {
  26.                 }
  27.         }
  28.         DWORD dwStop = timeGetTime();//结束时间
  29.         DWORD dwElapse = dwStop - dwStart;//时间间隔
  30.         CString strText;
  31.         strText.Format(_T("代码执行时间:%d ms"), dwElapse);
  32.         CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
  33.         pList->InsertString(0,strText);
  34. }
复制代码
  1. void CGkbc8Dlg::OnButton3()
  2. {
  3.         LARGE_INTEGER litmp;
  4.         QueryPerformanceFrequency(&litmp);
  5.         double dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
  6.         QueryPerformanceCounter(&litmp);
  7.         LONGLONG QPart1 = litmp.QuadPart;// 获得初始值
  8.         for (int i = 0; i < 10000; i++)
  9.         {
  10.                 for (int j = 0; j < 10000; j++)
  11.                 {
  12.                 }
  13.         }
  14.         QueryPerformanceCounter(&litmp);
  15.         LONGLONG QPart2  = litmp.QuadPart;//获得中止值
  16.         double   dfMinus = (double)(QPart2-QPart1);
  17.         double   dfTim   = dfMinus / dfFreq;// 获得对应的时间值,单位为秒        
  18.         //
  19.         CString strText;
  20.         strText.Format(_T("代码执行时间:%f ms"), dfTim*1000);
  21.         CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
  22.         pList->InsertString(0,strText);
  23. }
复制代码
我们来演示下功能实现的整个过程

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:实现微秒级精确定时功能--上位机VC.txt 
文件大小:48 Bytes  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索