求助:各位大哥,延时程序一般怎么写啊?谢谢! 一样FirstTick = GetTickCount(); while ((GetTickCount() - FirstTick) < t) { PeekMessages() } 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对不起漏了peekmessage那段应该是while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(!AfxGetApp()->PumpMessage()){ ::PostQuitMessage(0); } } load()函数是立即返回的么? 开线程处理文件load吗??如果不是...它应该会在处理完文件后才返回,,所以需要加任何代码...如果load是立即返回的,它开了一个线程在处理文件的load的话,那主线程应该waitforsingleobject() (大概 也许写错 )等待这个线程的结束的才对....然后继续下面的代码...反正不会是自己写个延时程序...那还不如直接sleep()呢...~~~ 谢谢各位大哥: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();} 现在问题是:有时播放 vai 文件只有声音没有图象,有时候有图象也有声音这是什么原因呢?我想是不是我的文件 load 好啊?谢谢! 哦.知道了...大概是说 还能继续界面上的响应 ??~~~那把run也丢到线程里好了...自己load完 自己run...主界面就只是屏幕黑着,,,等线程里开始run的时候,就有画面了. 谢谢大哥我没有用到线程编程啊我还不会大哥,我应该怎么改啊?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 秒就会运行一次 难道load是在一个线程中实现的?可以用event,然后waitforobject 难道load是在一个线程中实现的?可以用event,然后waitforobject是在同一个线程中实现的可以用event,然后waitforobject这样的程序怎么写啊?谢谢! 同一个线程中的话,就不需要延时了,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);} 谁用过VS2008 MFC的CLinkCtrl类 VC程序员最喜欢看到的字符串 利用OpenGL实现三维绘图的问题,帮忙看一下,弄了一天了 wmemset/_tcsset有什么差别? 我的Combo 控件怎么了? recvfrom接收数据的时候如何判断已经接收完了?? 怎么求一个点到线段的距离???求一个效率较高的算法 CFile 读取数据 关于滚动条续问(3) 这个异常奇妙的特效是如何做出来的,30' 视图之间访问数据 Gina的问题(讨论在WlxLoggedOutSAS中参数问题)
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage()){
::PostQuitMessage(0);
}
}
如果不是...它应该会在处理完文件后才返回,,所以需要加任何代码...如果load是立即返回的,它开了一个线程在处理文件的load的话,
那主线程应该waitforsingleobject() (大概 也许写错 )
等待这个线程的结束的才对....然后继续下面的代码...反正不会是自己写个延时程序...那还不如直接sleep()呢...
~~~
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();
}
有时播放 vai 文件只有声音
没有图象,有时候有图象也有声音这是什么原因呢?我想是不是我的文件 load 好啊?谢谢!
~~~那把run也丢到线程里好了...自己load完 自己run...
主界面就只是屏幕黑着,,,等线程里开始run的时候,就有画面了.
我没有用到线程编程啊
我还不会大哥,我应该怎么改啊?
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 秒就会运行一次
是在同一个线程中实现的可以用event,然后waitforobject
这样的程序怎么写啊?谢谢!
给你一个event例子:HANDLE hEvent = CretaeEvent();
ResetEvent(hEvent)CreateThread(.., ThreadFun, hEvent,...);
WaitForObject(hEvent, TIME_OUT);ThreadFun(LPVOID lpParam)
{
HANDLE hParam = (HANDLE)lpParam; // do something
SetEvent(hParam);
}