highgui(win32): improve waitKey() timeout condition
authorAlexander Alekhin <alexander.alekhin@intel.com>
Thu, 7 Jun 2018 16:25:01 +0000 (19:25 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Thu, 7 Jun 2018 16:31:08 +0000 (19:31 +0300)
- use cv::getTickCount() instead of Win32 GetTickCount()
- process message queue before timeout exit

modules/highgui/src/window_w32.cpp

index 5df18b3..ea7b461 100644 (file)
@@ -1965,7 +1965,8 @@ static void showSaveDialog(CvWindow* window)
 CV_IMPL int
 cvWaitKey( int delay )
 {
-    int time0 = GetTickCount();
+    int64 time0 = cv::getTickCount();
+    int64 timeEnd = time0 + (int64)(delay * 0.001f * cv::getTickFrequency());
 
     for(;;)
     {
@@ -1973,13 +1974,13 @@ cvWaitKey( int delay )
         MSG message;
         int is_processed = 0;
 
-        if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )
-            return -1;
-
         if( delay <= 0 )
             GetMessage(&message, 0, 0, 0);
         else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )
         {
+            int64 t = cv::getTickCount();
+            if (t - timeEnd >= 0)
+                return -1;  // no messages and no more time
             Sleep(1);
             continue;
         }