void dispatchFunctionsFromMainThread() { ASSERT(isMainThread()); if (callbacksPaused) return; double startTime = currentTime(); FunctionWithContext invocation; while (true) { { MutexLocker locker(mainThreadFunctionQueueMutex()); if (!functionQueue().size()) break; invocation = functionQueue().first(); functionQueue().removeFirst(); } invocation.function(invocation.context); if (invocation.syncFlag) invocation.syncFlag->signal(); // If we are running accumulated functions for too long so UI may become unresponsive, we need to // yield so the user input can be processed. Otherwise user may not be able to even close the window. // This code has effect only in case the scheduleDispatchFunctionsOnMainThread() is implemented in a way that // allows input events to be processed before we are back here. if (currentTime() - startTime > maxRunLoopSuspensionTime) { scheduleDispatchFunctionsOnMainThread(); break; } } }
void dispatchFunctionsFromMainThread() { ASSERT(isMainThread()); if (callbacksPaused) return; auto startTime = std::chrono::steady_clock::now(); FunctionWithContext invocation; while (true) { { std::lock_guard<std::mutex> lock(mainThreadFunctionQueueMutex()); if (!functionQueue().size()) break; invocation = functionQueue().takeFirst(); } invocation.function(invocation.context); // If we are running accumulated functions for too long so UI may become unresponsive, we need to // yield so the user input can be processed. Otherwise user may not be able to even close the window. // This code has effect only in case the scheduleDispatchFunctionsOnMainThread() is implemented in a way that // allows input events to be processed before we are back here. if (std::chrono::steady_clock::now() - startTime > maxRunLoopSuspensionTime) { scheduleDispatchFunctionsOnMainThread(); break; } } }