⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer7˵

📁 动画应用程序View 动画应用程序View 动画应用程序View 动画应用程序View 动画应用程序View
💻
字号:
1:使用QueryPerformanceFrequency()和QueryPerformanceCounter()函数来实现ms级或微秒级延时:
  ms级级延时

  void CMulti_TimerDlg::OnButtonTime7() 
  {
	LARGE_INTEGER  litmp; 
	LONGLONG       QPart1,QPart2;;
	double         dfMinus, dfFreq, dfTim; 
	QueryPerformanceFrequency(&litmp); 
	dfFreq = (double)litmp.QuadPart; // 获得计数器的时钟频率
	QueryPerformanceCounter(&litmp); 
	QPart1 = litmp.QuadPart; // 获得初始值
	do{
		QueryPerformanceCounter(&litmp); 
		QPart2 = litmp.QuadPart;// 获得中止值 
		dfMinus = (double)(QPart2-QPart1); 
		dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒
	}while(dfTim<0.001);
	CString  str1;
	str1.Format("%.12f",(dfTim-0.001)*1000);
	SetDlgItemText(IDC_EDIT6,str1);
	MessageBox("1ms延时已到,其误差为文本框中的值,单位为ms!");
    }

  微秒级延时
   void CMulti_TimerDlg::OnButtonTime71() 
  {
	LARGE_INTEGER  litmp; 
	LONGLONG       QPart1,QPart2;;
	double         dfMinus, dfFreq, dfTim; 
	QueryPerformanceFrequency(&litmp); 
	dfFreq = (double)litmp.QuadPart; // 获得计数器的时钟频率
	QueryPerformanceCounter(&litmp); 
	QPart1 = litmp.QuadPart; // 获得初始值
	do{
		QueryPerformanceCounter(&litmp); 
		QPart2 = litmp.QuadPart;// 获得中止值 
		dfMinus = (double)(QPart2-QPart1); 
		dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒
	}while(dfTim<0.000001);
	CString  str1;
	str1.Format("%.12f",(dfTim-0.000001)*1000000);
	SetDlgItemText(IDC_EDIT6,str1);
	MessageBox("1微妙延时已到,其误差为文本框中的值,单位为微妙!");
  }

2:用来测试函数Sleep(100)的精确持续时间:
  void CMulti_TimerDlg::OnButtonTime72() 
  {
	LARGE_INTEGER litmp; 
    LONGLONG QPart1,QPart2; 
    double dfMinus, dfFreq, dfTim; 
    QueryPerformanceFrequency(&litmp); 
	QueryPerformanceFrequency(&litmp); 
	dfFreq = (double)litmp.QuadPart; // 获得计数器的时钟频率
	QueryPerformanceCounter(&litmp); 
	QPart1 = litmp.QuadPart; // 获得初始值
        Sleep(100); 
	QueryPerformanceCounter(&litmp); 
	QPart2 = litmp.QuadPart;// 获得中止值 
	dfMinus = (double)(QPart2-QPart1); 
	dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒
	CString  str2;
	str2.Format("%.12f",(dfTim*1000-100));
	SetDlgItemText(IDC_EDIT7,str2);
	MessageBox("由于Sleep()函数自身的误差,程序每次执行的结果都会有微小误差,其误差为文本框中        的值,单位为ms!");
    }

3:使用QueryPerformanceFrequency()和QueryPerformanceCounter()函数来实现ms级或微秒级定时器

  a:在头文件中自定义定时器时间到响应消息 #define WM_UPDATETIME6   WM_USER+1005
  b:在头文件中声明WM_UPDATETIME6   消息的响应函数OnUpdateTime6()
 
 //{{AFX_MSG(CMulti_TimerDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnButtonTime1();
	afx_msg void OnTimer(UINT nIDEvent);
	afx_msg void OnButtonTime2();
	afx_msg void OnButtonTime3();
	afx_msg void OnButtonTime4();
	afx_msg void OnButtonTime31();
	afx_msg void OnButtonTime41();
	afx_msg void OnButtonTime5();
	afx_msg void OnButtonTime51();
	afx_msg void OnButtonTime6();
	afx_msg void OnButtonTime7();
	afx_msg void OnButtonTime71();
	afx_msg void OnButtonTime72();
	afx_msg void OnButtonTime73();
	afx_msg void OnAbout();
	afx_msg void OnButtonTime61();
	//}}AFX_MSG
	void OnUpdateTime6();
	DECLARE_MESSAGE_MAP()
  c:在*.cpp文件中映射WM_UPDATETIME6 消息,并定义响应函数,其代码如下:
   
    BEGIN_MESSAGE_MAP(CMulti_TimerDlg, CDialog)
	//{{AFX_MSG_MAP(CMulti_TimerDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_TIME1, OnButtonTime1)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_TIME2, OnButtonTime2)
	ON_BN_CLICKED(IDC_BUTTON_TIME3, OnButtonTime3)
	ON_BN_CLICKED(IDC_BUTTON_TIME4, OnButtonTime4)
	ON_BN_CLICKED(IDC_BUTTON_TIME3_1, OnButtonTime31)
	ON_BN_CLICKED(IDC_BUTTON_TIME4_1, OnButtonTime41)
	ON_BN_CLICKED(IDC_BUTTON_TIME5, OnButtonTime5)
	ON_BN_CLICKED(IDC_BUTTON_TIME5_1, OnButtonTime51)
	ON_BN_CLICKED(IDC_BUTTON_TIME6, OnButtonTime6)
	ON_BN_CLICKED(IDC_BUTTON_TIME7, OnButtonTime7)
	ON_BN_CLICKED(IDC_BUTTON_TIME7_1, OnButtonTime71)
	ON_BN_CLICKED(IDC_BUTTON_TIME7_2, OnButtonTime72)
	ON_BN_CLICKED(IDC_BUTTON_TIME7_3, OnButtonTime73)
	ON_BN_CLICKED(IDC_ABOUT, OnAbout)
	ON_BN_CLICKED(IDC_BUTTON_TIME6_1, OnButtonTime61)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_UPDATETIME6,OnUpdateTime6)
   END_MESSAGE_MAP()

   void CMulti_TimerDlg::OnUpdateTime6()
   {
	struct _timeb timebuffer;
	char *timeline;
	//获得毫秒级的时间
	_ftime( &timebuffer );
	timeline = ctime(&(timebuffer.time));
	//格式化时间
	CString m_Str;
	m_Str.Format("%.19s.%hu %s", timeline, timebuffer.millitm, &timeline[20]);
	SetDlgItemText(IDC_EDIT8,m_Str);
  }

 d:在*.cpp文件中定义一个线程函数,用来做定时器:

  UINT ShowTime6_1_Proc(LPVOID lParam);	//声明定时器函数

  UINT ShowTime6_1_Proc(LPVOID lParam)
  {
	CMulti_TimerDlg* pDlg = (CMulti_TimerDlg*)lParam;
	LARGE_INTEGER  litmp; 
	LONGLONG       QPart1,QPart2;;
	double         dfMinus, dfFreq, dfTim; 
	QueryPerformanceFrequency(&litmp); 
	dfFreq = (double)litmp.QuadPart; // 获得计数器的时钟频率
	QueryPerformanceCounter(&litmp); 
	QPart1 = litmp.QuadPart; // 获得初始值
	QPart2=QPart1;
	
	while(TRUE)
	{
		QPart1 = QPart2;// 上一次的终止值变成新的起始值
		::SendMessage(pDlg->m_hWnd,WM_UPDATETIME6,0,0);//发送消息通知对话框该更新时间了
		do{
			QueryPerformanceCounter(&litmp); 
			QPart2 = litmp.QuadPart;// 获得中止值 
			dfMinus = (double)(QPart2-QPart1); 
			dfTim = dfMinus / dfFreq; // 获得对应的时间值,单位为秒
		}while(dfTim<0.000001);
	}
	return 0;
   }
   
  e:在需要的地方开启定时器:
   void CMulti_TimerDlg::OnButtonTime73() 
  {
	AfxBeginThread(ShowTime6_1_Proc,this);//开启定时器
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -