有没有应用例子,可否共享呀。这东东可实现毫秒级?

解决方案 »

  1.   

    LARGE_INTEGER freq,time1,time2;         if(!QueryPerformanceFrequency(&freq)) 
            { 
                    AfxMessageBox("QueryPerformanceFrequency() error"); 
            }         QueryPerformanceCounter(&time1); 
    //      bit.DeDirty(dlg.m_InputData,pMFrm);//dosomething         QueryPerformanceCounter(&time2); 
            CString strTmp; 
            strTmp.Format("%f",(double)(time2.QuadPart-time1.QuadPart)/double)freq.QuadPart);         AfxMessageBox(strTmp); 使用这三个函数所得到的时间精度于操作系统有关 
      

  2.   

    这 段 程 序 的 主 要 功 能 是: 设 置 两 个 时 钟 定 时 器, 一 个 间 隔 是1 毫 秒, 一 个 间 隔 是2 秒, 每 执 行 一 次, 输 出 当 前 系 统 时 钟 值 到 文 件“cure.out”, 以 比 较 此 定 时 器 的 精 确 度。( 此 程 序 在 中 文windows95 及Microsoft VC5.0 编 译 通 过。 只 节 取 与 定 时 器 有 关 的 部 分 程 序。)  
     
    #include < stdio.h > 
    //包含所用系统函数的头文件,  
    如果编译有问题,可调整此语句的位置 
    #include < mmsystem.h > 
     
    //定义1毫秒和2秒时钟间隔,以毫秒为单位 
    #define ONE_MILLI_SECOND1 
    #define TWO_SECOND 2000 
    //定义时钟分辨率,以毫秒为单位 
    #define TIMER_ACCURACY1 
     
    UINT wTimerRes_1ms,wTimerRes_2s;  //定义时间间隔 
    UINT wAccuracy;//定义分辨率 
    UINT TimerID_1ms,TimerID_2s;//定义定时器句柄 
     
    CCureApp::CCureApp() 
    ∶  fout("cure.out", ios::out)//打开输出文件“cure.out” 

    // TODO: add construction code here, 
    // Place all significant  
           initialization in InitInstance 
    //给时间间隔变量赋值 
    wTimerRes_1ms = ONE_MILLI_SECOND ; 
    wTimerRes_2s = TWO_SECOND; 
     
    TIMECAPS  tc; 
    //通过函数timeGetDevCaps取出系统 
    的分辨率取值范围(对intel系统, 
    1~16毫秒),//如果无错则继续 
    if(timeGetDevCaps(&tc, sizeof(TIMECAPS))  
    == TIMERR_NOERROR) 

    //分辨率的值不能超出系统的取值范围 
    wAccuracy = min(max(tc.wPeriodMin,  
    TIMER_ACCURACY),tc.wPeriodMax); 
    //调用timeBeginPeriod函数设置定时器 
    的分辨率,类似于for循环的步长 
    timeBeginPeriod(wAccuracy); 
    //设置定时器 
    InitializeTimer(); 


     
    CCureApp::~CCureApp() 

    //结束时钟 
    fout < <  "结束时钟" < <  endl; 
    //删除两个定时器 
    timeKillEvent(TimerID_1ms); 
    timeKillEvent(TimerID_2s); 
    //删除设置的分辨率 
    timeEndPeriod(wAccuracy); 

    注:使用完的定时器及分辨率一定 
    要删除,否则系统会越来越慢。 
     
    void CCureApp::InitializeTimer() 

    StartOneMilliSecondTimer(); 
    StartTwoSecondTimer(); 

     
    //一毫秒定时器的回调函数, 
    类似于中断处理程序 
    voidPASCAL//一定要声明为全局PASCAL函数, 
    否则编译会有问题 
    OneMilliSecondProc(UINT wTimerID, UINT msg, 
    DWORD dwUser, DWORD dw1, DWORD dw2) 

    static int ms = 0;//定义计数器 
    CCureApp *app = (CCureApp *)dwUser; 
    //取得系统时间以毫秒为单位 
    DWORD osBinaryTime = GetTickCount(); 
    //输出计数器值和当前系统时间到文件  
    app- >fout < <  ++ms < <  ": 1ms : " 
     < <  osBinaryTime < <  endl; 

     
    //加装1毫秒定时器 
    void  CCureApp::StartOneMilliSecondTimer() 

    if((TimerID_1ms = timeSetEvent(wTimerRes_1ms, wAccuracy, 
     (LPTIMECALLBACK) OneMilliSecondProc,//回调函数 
     (DWORD)this,//用户自传送到回调函数的数据 
    /*周期调用,只使用一次用TIME_ONESHOT*/ 
    TIME_PERIODIC)) == 0) 

    AfxMessageBox("不能计时", MB_OK | MB_ICONASTERISK); 

    else//不等于0表明加装成功,  
    返回此定时器的句柄 
    fout < <  "16ms计时:" < <  endl; 

     
    以下为2秒定时器的回调函 
    数和加装函数,与1毫秒的类似; 
    void  PASCAL 
    TwoSecondProc(UINT wTimerID, UINT msg, 
      DWORD dwUser, DWORD dw1, DWORD dw2) 

    static int s = 0; 
    CCureApp *app = (CCureApp *)dwUser; 
    DWORD osBinaryTime = GetTickCount();  
    app- >fout < <  "*********************** 
    ***********************" < <  endl; 
    app- >fout < <  ++s < <  ": 2s : " 
     < <  osBinaryTime < <  endl; 

     
    void CCureApp::StartTwoSecondTimer() 

    if((TimerID_2s = timeSetEvent(wTimerRes_2s, wAccuracy, 
     (LPTIMECALLBACK) TwoSecondProc, 
     (DWORD)this, 
      TIME_PERIODIC)) == 0) 

    AfxMessageBox("不能计时", MB_OK | MB_ICONASTERISK); 

    else 
    fout < <  "2s计时:" < <  endl;