16,472
社区成员
发帖
与我相关
我的任务
分享
struct Sleep1_struct
{
HANDLE hEvent;
int nSleepTime;
};
UINT Sleep1Thread(LPVOID pWaitTime)
{
Sleep1_struct * sleep = (Sleep1_struct *)pWaitTime;
Sleep(sleep->nSleepTime);
SetEvent(sleep->hEvent); //休眠结束后, 设为有讯号
return 0;
}
void CEventImporterUIDlg::Sleep1(unsigned long nWaitTime)
{
Sleep1_struct sleep;
sleep.nSleepTime = nWaitTime;
sleep.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
CWinThread * pThread = AfxBeginThread(Sleep1Thread, &sleep); //建立 Thread
//WaitForSingleObject() 有讯号状态下, 会返回 WAIT_OBJECT_0, 无讯号则返回 WAIT_TIMEOUT
while(WaitForSingleObject(sleep.hEvent, INFINITE) == WAIT_TIMEOUT)
{
//判断 UI 上是否有讯息需要处理
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CloseHandle(sleep.hEvent);
}
方法二:利用循环一次休眠 100 毫秒,这方法也蛮笨的
void CEventImporterUIDlg::Sleep2(unsigned long nWaitTime)
{
while(1)
{
//判断 UI 上是否有讯息需要处理
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//若 sleeptime 不足 100 豪秒, 则休眠 nWaitTime 后跳出
if(nWaitTime<100)
{
if(nWaitTime!=0)
Sleep(nWaitTime);
break;
}
//每次休眠 100 毫秒
Sleep(100);
nWaitTime -= 100;
}
}
方法三:利用程式暂用 CPU 时间,不过一直循环好像很浪费 CPU 资源
void CEventImporterUIDlg::Sleep3(unsigned long nWaitTime)
{
unsigned long nStart = clock(); //clock() 会回传程式执行后占用的 CPU 时间, 精确度到毫秒
unsigned long nEnd = nStart;
do
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
nEnd = clock();
} while( ( nEnd - nStart ) <= nWaitTime );
}