File indexing completed on 2024-12-22 05:13:39

0001 /*
0002     SPDX-FileCopyrightText: 2014-2016 Ivan Cukic <ivan.cukic(at)kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "mainthreadexecutor_p.h"
0008 
0009 #include <mutex>
0010 
0011 #include <QCoreApplication>
0012 #include <QMetaObject>
0013 #include <QThread>
0014 
0015 namespace KActivities
0016 {
0017 namespace detail
0018 {
0019 MainThreadExecutor::MainThreadExecutor(std::function<void()> &&f)
0020     : m_function(std::forward<std::function<void()>>(f))
0021 {
0022 }
0023 
0024 void MainThreadExecutor::start()
0025 {
0026     m_function();
0027     deleteLater();
0028 }
0029 
0030 } // namespace detail
0031 
0032 void runInMainThread(std::function<void()> &&f)
0033 {
0034     static auto mainThread = QCoreApplication::instance()->thread();
0035 
0036     if (QThread::currentThread() == mainThread) {
0037         f();
0038 
0039     } else {
0040         auto executor = new detail::MainThreadExecutor(std::forward<std::function<void()>>(f));
0041 
0042         executor->moveToThread(mainThread);
0043 
0044         QMetaObject::invokeMethod(executor, "start", Qt::BlockingQueuedConnection);
0045     }
0046 }
0047 
0048 } // namespace KActivities
0049 
0050 #include "moc_mainthreadexecutor_p.cpp"