本函数是在状态条上显示当前时间。
void CMainFrame::SetStatusTime()
{
SYSTEMTIME RTime;
CString str;
GetSystemTime(&RTime);
str.Format("%d:% d:% ",RTime.wHour+8,RTime.wMinute,RTime.wSecond); m_wndStatusBar.SetPaneText(2,str,TRUE);
} 在CMainFrame下的OnTimer事件下调用SetStausTime函数,程序没有任何问题,可是在多媒体定时器函数中(很明显是一个全局函数),调用的时候程序出现错误,情况很是不明了。
付定时器函数(本函数没5毫秒执行一次,到了一秒后调用上面的函数)
void PASCAL OneMilliSecondProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;
dfMinus=(double)QPart2-QPart1;
dfTim=dfMinus/dfFreq;
dfTim=dfTim*1000;
if (dfTim>10)
{
last_stamp+=(int)dfTim;
itimer+=(int)dfTim;
}
else
{
last_stamp+=10;
itimer+=10;
}
if(itimer>1000)
{
itimer=0;
}
QPart1=QPart2;

}}

解决方案 »

  1.   

    多媒体定时器函数的精确度没有那么高,timeGetDevCaps()返回系统支持的最高精确度,uResolution 设的不对会出错。
      

  2.   

    多媒体定时器函数精确度没那么高,可能你的uResolution设错了,5毫秒太快了timeGetDevCaps()返回正确精度
      

  3.   

    没看到你调用SetStausTime函数的语句呀。
      

  4.   

    哦,对,少写了
    if(itimer>1000)
    {
    myMainFrame->SetStausTime()
    }
    因为是全局函数,所以要用指针。理论上来讲,精度可以精确到1毫秒,但我更新状态的时候是1秒钟更新
      

  5.   

    那很可能是你对myMainFrame的赋值问题。
      

  6.   

    不会
    因为我调用myMainFrame其他的函数就可以
    在OnCreate函数里这样说明
    myMainFrame=this;
      

  7.   

    在CMainFrame的OnTimer事件中,当然先运行OnCreate,所以myMainFrame的赋值是正确的;可是对于OneMilliSecondProc函数,不知道在那里初始化,就不知道比CMainFrame::OnCreate那个先运行,所以不知道你的myMainFrame是否正确赋值。
      

  8.   

    我的多媒体定时器是在进入系统之后才开始运行的。
    刚才我说的调用其他函数可以,比如CFormView上某个控件的属性设置