From b524e275c1db2f09f2a3a5f6ccc7ad6fc5d4bc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Devernay?= Date: Tue, 2 Jul 2013 18:08:12 +0200 Subject: [PATCH] allow QtKit capture in secondary threads [NSRunLoop currentRunLoop] is not the same as in the main thread. see https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/F oundation/Classes/nsrunloop_Class/Reference/Reference.html "If no input sources or timers are attached to the run loop, this method exits immediately" The old code caused grabFrame() to return immediately if the capture was not done in the main thread. This code works correctly, even in secondary threads, provided that all capture functions are called in the *same* thread --- modules/highgui/src/cap_qtkit.mm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/highgui/src/cap_qtkit.mm b/modules/highgui/src/cap_qtkit.mm index c7afffa075..207f01b525 100644 --- a/modules/highgui/src/cap_qtkit.mm +++ b/modules/highgui/src/cap_qtkit.mm @@ -277,11 +277,8 @@ bool CvCaptureCAM::grabFrame(double timeOut) { double sleepTime = 0.005; double total = 0; - NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:sleepTime]; - while (![capture updateImage] && (total += sleepTime)<=timeOut && - [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode - beforeDate:loopUntil]) - loopUntil = [NSDate dateWithTimeIntervalSinceNow:sleepTime]; + while (![capture updateImage] && (total += sleepTime)<=timeOut) + usleep((int)(sleepTime*1000)); [localpool drain];