本文共 1803 字,大约阅读时间需要 6 分钟。
CV_IMPL int cvWaitKey( int delay )
{
//计算当前的毫秒数 int time0 = GetTickCount();
//无限循环
for(;;)
{
CvWindow* window;
MSG message;
int is_processed = 0; //消息标示,初始未被处理
//如果等候时间已到 或者 没有图像窗口需要等待,则退出函数
if( (delay > 0 &&
abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )
return -1;
if( delay <= 0 )//
当等待的时间小于等于0时 GetMessage(&message, 0, 0, 0); //无限的等待消息。(
阻塞式函数)
else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE ) // 如果没有查询到消息. (非阻塞式函数)
{
Sleep(1); //让渡出线程的时间片,防止CPU居高不下; 等待时间可能很长,不可能让CPU一直处理本函数。该用法很有用。
continue; //继续f
无限or循环
}
//处理多个opencv窗口的消息
for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )
{
if( window->hwnd == message.hwnd || window->frame == message.hwnd )
{
is_processed = 1; //消息被处理
switch(message.message)
{
case WM_DESTROY:
case WM_CHAR:
DispatchMessage(&message); //窗口处理
WM_DESTROY,和字符按键消息 return (int)message.wParam;
case WM_SYSKEYDOWN: //处理系统按键消息,如Alt, F1,....F12..
if( message.wParam == VK_F10 )
{
is_processed = 1;
return (int)(message.wParam << 16);
}
break;
case WM_KEYDOWN:
TranslateMessage(&message);
if( (message.wParam >= VK_F1 && message.wParam <= VK_F24) ||
message.wParam == VK_HOME || message.wParam == VK_END ||
message.wParam == VK_UP || message.wParam == VK_DOWN ||
message.wParam == VK_LEFT || message.wParam == VK_RIGHT ||
message.wParam == VK_INSERT || message.wParam == VK_DELETE ||
message.wParam == VK_PRIOR || message.wParam == VK_NEXT )
{
DispatchMessage(&message);
is_processed = 1;
return (int)(message.wParam << 16);
}
default:
DispatchMessage(&message); //分发消息给窗口程序
is_processed = 1;
break;
}
}
}
//将仍未处理过的消息,派发
if( !is_processed )
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
}
DWORD dwStart = :: GetTickCount();
while(::GetTickCount() - dwStart < 1000)
{
Sleep(1);
}
转载地址:http://xanws.baihongyu.com/