?? timer7說明.txt
字號:
1:使用QueryPerformanceFrequency()和QueryPerformanceCounter()函數(shù)來實(shí)現(xiàn)ms級或微秒級延時(shí):
ms級級延時(shí)
void CMulti_TimerDlg::OnButtonTime7()
{
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart; // 獲得計(jì)數(shù)器的時(shí)鐘頻率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 獲得初始值
do{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;// 獲得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq; // 獲得對應(yīng)的時(shí)間值,單位為秒
}while(dfTim<0.001);
CString str1;
str1.Format("%.12f",(dfTim-0.001)*1000);
SetDlgItemText(IDC_EDIT6,str1);
MessageBox("1ms延時(shí)已到,其誤差為文本框中的值,單位為ms!");
}
微秒級延時(shí)
void CMulti_TimerDlg::OnButtonTime71()
{
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart; // 獲得計(jì)數(shù)器的時(shí)鐘頻率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 獲得初始值
do{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;// 獲得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq; // 獲得對應(yīng)的時(shí)間值,單位為秒
}while(dfTim<0.000001);
CString str1;
str1.Format("%.12f",(dfTim-0.000001)*1000000);
SetDlgItemText(IDC_EDIT6,str1);
MessageBox("1微妙延時(shí)已到,其誤差為文本框中的值,單位為微妙!");
}
2:用來測試函數(shù)Sleep(100)的精確持續(xù)時(shí)間:
void CMulti_TimerDlg::OnButtonTime72()
{
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart; // 獲得計(jì)數(shù)器的時(shí)鐘頻率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 獲得初始值
Sleep(100);
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;// 獲得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq; // 獲得對應(yīng)的時(shí)間值,單位為秒
CString str2;
str2.Format("%.12f",(dfTim*1000-100));
SetDlgItemText(IDC_EDIT7,str2);
MessageBox("由于Sleep()函數(shù)自身的誤差,程序每次執(zhí)行的結(jié)果都會(huì)有微小誤差,其誤差為文本框中 的值,單位為ms!");
}
3:使用QueryPerformanceFrequency()和QueryPerformanceCounter()函數(shù)來實(shí)現(xiàn)ms級或微秒級定時(shí)器
a:在頭文件中自定義定時(shí)器時(shí)間到響應(yīng)消息 #define WM_UPDATETIME6 WM_USER+1005
b:在頭文件中聲明WM_UPDATETIME6 消息的響應(yīng)函數(shù)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 消息,并定義響應(yīng)函數(shù),其代碼如下:
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;
//獲得毫秒級的時(shí)間
_ftime( &timebuffer );
timeline = ctime(&(timebuffer.time));
//格式化時(shí)間
CString m_Str;
m_Str.Format("%.19s.%hu %s", timeline, timebuffer.millitm, &timeline[20]);
SetDlgItemText(IDC_EDIT8,m_Str);
}
d:在*.cpp文件中定義一個(gè)線程函數(shù),用來做定時(shí)器:
UINT ShowTime6_1_Proc(LPVOID lParam); //聲明定時(shí)器函數(shù)
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; // 獲得計(jì)數(shù)器的時(shí)鐘頻率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart; // 獲得初始值
QPart2=QPart1;
while(TRUE)
{
QPart1 = QPart2;// 上一次的終止值變成新的起始值
::SendMessage(pDlg->m_hWnd,WM_UPDATETIME6,0,0);//發(fā)送消息通知對話框該更新時(shí)間了
do{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;// 獲得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq; // 獲得對應(yīng)的時(shí)間值,單位為秒
}while(dfTim<0.000001);
}
return 0;
}
e:在需要的地方開啟定時(shí)器:
void CMulti_TimerDlg::OnButtonTime73()
{
AfxBeginThread(ShowTime6_1_Proc,this);//開啟定時(shí)器
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -