工控编程吧
标题:
实现微秒级精确定时功能--上位机VC
[打印本页]
作者:
qq263946146
时间:
2016-11-30 21:00
标题:
实现微秒级精确定时功能--上位机VC
(, 下载次数: 3)
上传
点击文件名下载附件
实现微秒级精确定时功能--上位机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>关联点击函数,分别实现三种定时功能
void CGkbc8Dlg::OnButton1()
{
DWORD dwStart = GetTickCount();//开始时间
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
}
}
DWORD dwStop = GetTickCount();//结束时间
DWORD dwElapse = dwStop - dwStart;//时间间隔
CString strText;
strText.Format(_T("代码执行时间:%d ms"), dwElapse);
CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
pList->InsertString(0,strText);
}
#include<Mmsystem.h >
#pragma comment(lib,"Winmm.lib")
void CGkbc8Dlg::OnButton2()
{
DWORD dwStart = timeGetTime();//开始时间
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
}
}
DWORD dwStop = timeGetTime();//结束时间
DWORD dwElapse = dwStop - dwStart;//时间间隔
CString strText;
strText.Format(_T("代码执行时间:%d ms"), dwElapse);
CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
pList->InsertString(0,strText);
}
复制代码
void CGkbc8Dlg::OnButton3()
{
LARGE_INTEGER litmp;
QueryPerformanceFrequency(&litmp);
double dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
LONGLONG QPart1 = litmp.QuadPart;// 获得初始值
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
}
}
QueryPerformanceCounter(&litmp);
LONGLONG QPart2 = litmp.QuadPart;//获得中止值
double dfMinus = (double)(QPart2-QPart1);
double dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
//
CString strText;
strText.Format(_T("代码执行时间:%f ms"), dfTim*1000);
CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
pList->InsertString(0,strText);
}
复制代码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/3e9708c2899ebb37ad7e21a04acf7e9c/0/0/w_19ruj9ukj9.swf-albumId=6858301209-tvId=6858301209-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[weixinlianxi]1[/weixinlianxi]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4