Be careful when using Sleep and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. If you have a thread that uses Sleep with infinite delay, the system will deadlock. Two examples of code that indirectly creates windows are DDE and COM CoInitialize. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than Sleep.
解决方案 »
- ado访问数据库,连接对象,记录集对象定义在哪里
- VC6.0下面为什么编译不通过?
- 关于c_str的问题
- 俩个线程启动时//加上大概500毫秒时间差//线程执行过程中,是否会发生晚启动的超过早启动的
- 急。。。。。。。》》》http协议相关。。。
- 问题表达不清楚另开贴问: 如何实现QQ[皮肤颜色选择]的功能,通过色调和亮度来调节
- 200分,求助几个网络编程的超级难题,在客户端正常或者不正常消失时,服务器端释放资源
- 祝CSDN的朋友们新年快乐!万事如意!工作顺利!合家幸福!身体健康!$$多多
- CAD类软件系统中与用户的复杂交互如何轻松的维护
- 求教 CDatabase 操作 EXCEL 基础问题
- 这个函数该怎么改好。
- 摄像机采集运行几小时后停止
如果只是想隔一段时间再执行其它代码的话,可以用计时器,SetTimer()
while(PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE)
{
Sleep(100)
}
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 );
}