实现微秒级精确定时功能--上位机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>关联点击函数,分别实现三种定时功能 - 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);
- }
复制代码我们来演示下功能实现的整个过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|