一样
FirstTick = GetTickCount();
   while ((GetTickCount() - FirstTick) < t) 
  {
      PeekMessages()
   }

解决方案 »

  1.   

    对不起漏了peekmessage那段应该是
    while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
    {
    if(!AfxGetApp()->PumpMessage()){
    ::PostQuitMessage(0);
    }
    }
      

  2.   

    load()函数是立即返回的么? 开线程处理文件load吗??
    如果不是...它应该会在处理完文件后才返回,,所以需要加任何代码...如果load是立即返回的,它开了一个线程在处理文件的load的话,
    那主线程应该waitforsingleobject() (大概 也许写错 )
    等待这个线程的结束的才对....然后继续下面的代码...反正不会是自己写个延时程序...那还不如直接sleep()呢...
    ~~~
      

  3.   

    谢谢各位大哥:
    casinosun 大哥:
    FirstTick = GetTickCount();
       while ((GetTickCount() - FirstTick) < t) 
      {
          while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
    {
    if(!AfxGetApp()->PumpMessage()){
    ::PostQuitMessage(0);
    }
    }
       }
    这样是吗?不是多线程的:
    #include "..\\H\\Video.h"
    //初始化各接口,为播放作准备
    CVideo::CVideo( HWND hWnd )
    {
    /// direct show
    // 先赋空值,在初始化
    m_pGraph = NULL; // 流过滤器
    m_pMediaControl = NULL; // 流媒体播放器
    m_pMediaPosition = NULL; // 播放位置
    m_pEvent = NULL; // 流媒体触发事件
    m_pViewWin = NULL;
    m_hWnd = hWnd; // 播放视频的窗口 /// direct sound
    // 赋空
    m_pSound = NULL; // 音效的硬件指针
    m_pSBuffer = NULL; InitSound();
    // 初始化流媒体播放
    InitStream();
    }
    //初始化流媒体播放
    HRESULT CVideo::InitStream()
    {
    // 创建过滤器
     CoInitialize( NULL );
    CoCreateInstance(CLSID_FilterGraph, NULL,
                         CLSCTX_INPROC, IID_IGraphBuilder, (void**)&m_pGraph); // 创建控制器
    m_pGraph->QueryInterface( IID_IMediaControl, ( void** )&m_pMediaControl ); // 创建播放位置
    m_pGraph->QueryInterface( IID_IMediaPosition, ( void** )&m_pMediaPosition ); // 创建事件响应接口
    m_pGraph->QueryInterface( IID_IMediaEvent, ( void** )&m_pEvent ); // 创建播放窗口
    m_pGraph->QueryInterface( IID_IVideoWindow, ( void** )&m_pViewWin );
    return S_OK;
    }//载入指定文件名的音乐,视频文件
    bool CVideo::readfile( LPSTR pFileName )
    {
    WCHAR wstrSoundPath[MAX_PATH];
    CHAR strSoundPath[MAX_PATH];
    static HWND hDrain = 0; switch( m_Id )
    {
    case VIDEO_MOVING:
    // 得到sound文件夹名
    GetCurrentDirectory(MAX_PATH, strSoundPath);
    strcat(strSoundPath, "\\");
    strcat(strSoundPath, pFileName); //变为宽字节,防止中文路径有错误
    MultiByteToWideChar(CP_ACP, 0, strSoundPath, -1, wstrSoundPath, MAX_PATH);
    if(S_OK!= m_pGraph->RenderFile(wstrSoundPath, NULL)) //MustBe NULL
    return false;

    break;
    case VIDEO_MP3:
    // 得到sound文件夹名
    GetCurrentDirectory(MAX_PATH, strSoundPath);
    strcat(strSoundPath, "\\");
    strcat(strSoundPath, pFileName); //变为宽字节,防止中文路径有错误
    MultiByteToWideChar(CP_ACP, 0, strSoundPath, -1, wstrSoundPath, MAX_PATH);

    // 渲染文件
    m_pGraph->RenderFile(wstrSoundPath, NULL);
    break;
    return false;
    } return true;
    }//判断是否播放结束,如果结束则停止播放
    BOOL CVideo::IsEnd()
    {
    // 当前位置和总长度
    REFTIME refPosition;
    REFTIME refDuration;
    switch( m_Id )
    {
    // 播放mps
    case VIDEO_MOVING:
    case VIDEO_MP3:
    // 得到当前位置和总长度
    m_pMediaPosition->get_CurrentPosition( &refPosition );
    m_pMediaPosition->get_Duration( &refDuration );
    // 判断是否播放完
    if( !m_isLoop && ( refPosition >= refDuration ) )
    {
    // 结束播放
    m_pMediaControl->Stop();
    m_Id = VIDEO_NONE;
    return true;
    }
    break;
    // 播放音效
    case VIDEO_SOUND:
    DWORD size;
    m_pSBuffer->GetCurrentPosition( &size, NULL );
    // 如果播放完,结束
    /* if( size >= m_dsdesc.dwSize )
    {
    m_pSBuffer->Stop();
    m_Id = VIDEO_NONE;
    }*/
    break;
    // 播放视频
    /*case VIDEO_MOVING:*/
    /*LONG evCode;
    m_pEvent->WaitForCompletion( INFINITE, &evCode );*/
    }
    return false;
    }//播放Mp3音乐
    bool CVideo::Play( LPSTR pFileName, EnumVideo Id, BOOL isLoop )
    {
    m_Id = Id;
    m_isLoop = isLoop;
    // 载入
    if( !readfile( pFileName ) )
    {
    return false;
    }
    switch( Id )
    {
    case VIDEO_MOVING:
    //设置当前位置
    m_pMediaPosition->put_CurrentPosition(0);
    if(m_pViewWin != NULL )
    m_pViewWin->put_Owner((OAHWND)m_hWnd); 
    m_pViewWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS| WS_CLIPCHILDREN);

    RECT rect;

    GetClientRect(m_hWnd,&rect);
    m_pViewWin->SetWindowPosition(rect.left, rect.top, rect.right, rect.bottom);
    m_pViewWin->put_Visible(OATRUE); // g_pVideoWindow->put_FullScreenMode(OATRUE);
    if(m_pViewWin != NULL )
    m_pViewWin->put_MessageDrain((OAHWND)m_hWnd);
    break;
    case VIDEO_MP3:
    break;
    case VIDEO_SOUND:
    break;
    }
    return true;
    }
    // 播放
    void CVideo::run( EnumVideo Id)
    {
    switch( Id )
    {
    case VIDEO_MOVING:
    m_pMediaControl->Run();
    break;
    case VIDEO_MP3:
    // 初始位置
    m_pMediaPosition->put_CurrentPosition(0);
    m_pMediaControl->Run();
    break;
    case VIDEO_SOUND:
    // 音效一次播放
    m_pSBuffer->Play( 0, 0, 1 );
    break;
    }
    }CVideo::~CVideo()
    {
    SafeRelease( m_pSBuffer );
    SafeRelease( m_pSound ); SafeRelease( m_pViewWin );
    SafeRelease( m_pEvent );
    SafeRelease( m_pMediaPosition );
    SafeRelease( m_pEvent );
    // SAFE_RELEASE( m_pWin );
    CoUninitialize();
    }
      

  4.   

    现在问题是:
    有时播放 vai 文件只有声音
    没有图象,有时候有图象也有声音这是什么原因呢?我想是不是我的文件 load 好啊?谢谢!
      

  5.   

    哦.知道了...大概是说 还能继续界面上的响应 ??
    ~~~那把run也丢到线程里好了...自己load完 自己run...
    主界面就只是屏幕黑着,,,等线程里开始run的时候,就有画面了.
      

  6.   

    谢谢大哥
    我没有用到线程编程啊
    我还不会大哥,我应该怎么改啊?
    bool FrameFunc()                                              
    {
       MyGame_Play.FrameDt = hge->Timer_GetDelta();                                  //从上次开始渲染到结束渲染所需要的时间  
      if(pldd)
     {
         MyCVideo = new CVideo(hWnd);
         FirstTick = GetTickCount();      MyCVideo->Play(".\\avi\\start1.avi", VIDEO_MOVING,false);
          MyCVideo->run(VIDEO_MOVING);
          pldd = false;
     }
        return false;
    }这个 FrameFunc() 引擎内部定义好了的函数
    每 0.1 秒就会运行一次
      

  7.   

    难道load是在一个线程中实现的?可以用event,然后waitforobject
      

  8.   

    难道load是在一个线程中实现的?可以用event,然后waitforobject
    是在同一个线程中实现的可以用event,然后waitforobject
    这样的程序怎么写啊?谢谢!
      

  9.   

    同一个线程中的话,就不需要延时了,load完,才能run的。
    给你一个event例子:HANDLE hEvent = CretaeEvent();
    ResetEvent(hEvent)CreateThread(.., ThreadFun, hEvent,...);
    WaitForObject(hEvent, TIME_OUT);ThreadFun(LPVOID lpParam)
    {
       HANDLE hParam = (HANDLE)lpParam;   // do something
      
       SetEvent(hParam);
    }