• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        實戰VC時間控制函數

        實戰VC時間控制函數

        更新時間:2022-04-28 文章作者:未知 信息來源:網絡 閱讀次數:

        隨著軟硬件的飛速發展,計算機技術已經廣泛地應用到自動化控制領域,為了實現實時控制,控制程序必須能夠精確地完成定時和計時功能。VC提供了很多關于時間操作的函數,下面根據它們精度的不同,分別進行說明。

        一般時控函數

          VC程序員都會利用Windows的WM_TIMER消息映射來進行簡單的時間控制:1.調用函數SetTimer()設置定時間隔,如SetTimer(0,200,NULL)即為設置200毫秒的時間間隔;2.在應用程序中增加定時響應函數OnTimer(),并在該函數中添加響應的處理語句,用來完成時間到時的操作。這種定時方法是非常簡單的,但其定時功能如同Sleep()函數的延時功能一樣,精度較低,只可以用來實現諸如位圖的動態顯示等對定時精度要求不高的情況,而在精度要求較高的條件下,這種方法應避免采用。

        精度時控函數

          在要求誤差不大于1毫秒的情況下,可以采用GetTickCount()函數,該函數的返回值是DWORD型,表示以毫秒為單位的計算機啟動后經歷的時間間隔。使用下面的編程語句,可以實現50毫秒的精確定時,其誤差小于1毫秒。

          DWORD dwStart, dwStop;

          // 起始值和終止值

          dwStop = GetTickCount();

          while(TRUE)
          {
              dwStart = dwStop;
          // 上一次的終止值變成新的起始值
          // 此處添加相應控制語句
           do
           {
               dwStop = GetTickCount();
           }while(dwStop - 50 < dwStart);
          }  


        高精度時控函數

          對于一般的實時控制,使用GetTickCount()函數就可以滿足精度要求,但要進一步提高計時精度,就要采用QueryPerformanceFrequency()函數和QueryPerformanceCounter()函數。這兩個函數是VC提供的僅供Windows 9X使用的高精度時間函數,并要求計算機從硬件上支持高精度計時器。QueryPerformanceFrequency()函數和QueryPerformanceCounter()函數的原型為:

          BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

          BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);


          數據類型LARGE—INTEGER既可以是一個作為8字節長的整型數,也可以是作為兩個4字節長的整型數的聯合結構,其具體用法根據編譯器是否支持64位而定。該類型的定義如下:

          typedef union _LARGE_INTEGER
          {
           struct
           {
               DWORD LowPart; // 4字節整型數
               LONG  HighPart; // 4字節整型數
             };
          LONGLONG  QuadPart;

          // 8字節整型數
          } LARGE_INTEGER;  


          在進行計時之前,應該先調用QueryPerformanceFrequency()函數獲得機器內部計時器的時鐘頻率。筆者在主頻為266、300、333的三種PentiumⅡ機器上使用該函數,得到的時鐘頻率都是1193180Hz。接著,筆者在需要嚴格計時的事件發生之前和發生之后分別調用QueryPerformanceCounter()函數,利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經歷的精確時間。以下程序是用來測試函數Sleep(100)的精確持續時間。

          LARGE—INTEGER litmp;

          LONGLONG QPart1,QPart2;

          double dfMinus, dfFreq, dfTim;

          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;
          // 獲得對應的時間值


          執行上面程序,得到的結果為dfTim=0.097143767076216(秒)。細心的讀者會發現,每次執行的結果都不一樣,存在一定的差別,這是由于Sleep()自身的誤差所致。

          本文介紹了三種定時或計時的實現方法,讀者可以根據自己的實際情況進行選擇,以達到程序的定時和計時功能。以上程序均在VC 6.0、Windows 98環境下調試通過。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲AV色欲色欲WWW| 国产无遮挡又黄又爽免费网站| 亚洲av永久综合在线观看尤物| 亚洲欧美日韩中文字幕一区二区三区 | 国产精品酒店视频免费看| 亚洲国产成人精品91久久久| 99久久精品国产亚洲| 亚洲AV无码专区在线厂| 午夜理伦剧场免费| 国产免费人成在线视频| 亚洲国产av美女网站| 拍拍拍无挡视频免费观看1000| 永久免费av无码网站大全| 久久亚洲国产精品成人AV秋霞| www.av在线免费观看| 99久热只有精品视频免费看| 亚洲综合激情另类专区| 亚洲精品国产suv一区88| 无码人妻精品中文字幕免费| 亚洲国产天堂久久综合网站| a国产成人免费视频| 日产国产精品亚洲系列| 亚洲无人区视频大全| 国产精品白浆在线观看免费| 亚洲一区二区三区国产精品| 不卡视频免费在线观看| 久久精品亚洲精品国产色婷| 成人看的午夜免费毛片| 亚洲一区二区三区高清在线观看 | 特级毛片A级毛片免费播放| 最新仑乱免费视频| 美女黄频视频大全免费的| 久久国产亚洲精品麻豆| 国产真人无码作爱免费视频| 久久久久久亚洲Av无码精品专口 | 亚洲色四在线视频观看| 四虎永久在线精品免费影视 | 亚洲欧美日韩中文字幕一区二区三区 | 亚洲中文久久精品无码ww16| 一级毛片**免费看试看20分钟| 亚洲va久久久噜噜噜久久天堂|