mirror of
https://github.com/Mahdi-zarei/nekoray.git
synced 2025-12-18 20:50:09 +08:00
improve thread management
This commit is contained in:
parent
150ae3ed78
commit
3f3b268916
39
3rdparty/QThreadCreateThread.hpp
vendored
39
3rdparty/QThreadCreateThread.hpp
vendored
@ -1,39 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <future>
|
||||
#include <QThread>
|
||||
|
||||
// FOR OLD QT
|
||||
|
||||
class QThreadCreateThread : public QThread {
|
||||
public:
|
||||
explicit QThreadCreateThread(std::future<void> &&future)
|
||||
: m_future(std::move(future)) {
|
||||
// deleteLater
|
||||
connect(this, &QThread::finished, this, &QThread::deleteLater);
|
||||
}
|
||||
|
||||
private:
|
||||
void run() override {
|
||||
m_future.get();
|
||||
}
|
||||
|
||||
std::future<void> m_future;
|
||||
};
|
||||
|
||||
inline QThread *createThreadImpl(std::future<void> &&future) {
|
||||
return new QThreadCreateThread(std::move(future));
|
||||
}
|
||||
|
||||
template<typename Function, typename... Args>
|
||||
QThread *createQThread(Function &&f, Args &&... args) {
|
||||
using DecayedFunction = typename std::decay<Function>::type;
|
||||
auto threadFunction =
|
||||
[f = static_cast<DecayedFunction>(std::forward<Function>(f))](auto &&... largs) mutable -> void {
|
||||
(void) std::invoke(std::move(f), std::forward<decltype(largs)>(largs)...);
|
||||
};
|
||||
|
||||
return createThreadImpl(std::async(std::launch::deferred,
|
||||
std::move(threadFunction),
|
||||
std::forward<Args>(args)...));
|
||||
}
|
||||
96
3rdparty/qscopeguard.h
vendored
96
3rdparty/qscopeguard.h
vendored
@ -1,96 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 3 requirements
|
||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 2.0 or (at your option) the GNU General
|
||||
** Public license version 3 or any later version approved by the KDE Free
|
||||
** Qt Foundation. The licenses are as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QSCOPEGUARD_H
|
||||
#define QSCOPEGUARD_H
|
||||
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
||||
template <typename F> class QScopeGuard;
|
||||
template <typename F> QScopeGuard<F> qScopeGuard(F f);
|
||||
|
||||
template <typename F>
|
||||
class QScopeGuard
|
||||
{
|
||||
public:
|
||||
QScopeGuard(QScopeGuard &&other) Q_DECL_NOEXCEPT
|
||||
: m_func(std::move(other.m_func))
|
||||
, m_invoke(other.m_invoke)
|
||||
{
|
||||
other.dismiss();
|
||||
}
|
||||
|
||||
~QScopeGuard()
|
||||
{
|
||||
if (m_invoke)
|
||||
m_func();
|
||||
}
|
||||
|
||||
void dismiss() Q_DECL_NOEXCEPT
|
||||
{
|
||||
m_invoke = false;
|
||||
}
|
||||
|
||||
private:
|
||||
explicit QScopeGuard(F f) Q_DECL_NOEXCEPT
|
||||
: m_func(std::move(f))
|
||||
{
|
||||
}
|
||||
|
||||
Q_DISABLE_COPY(QScopeGuard)
|
||||
|
||||
F m_func;
|
||||
bool m_invoke = true;
|
||||
friend QScopeGuard qScopeGuard<F>(F);
|
||||
};
|
||||
|
||||
|
||||
template <typename F>
|
||||
QScopeGuard<F> qScopeGuard(F f)
|
||||
{
|
||||
return QScopeGuard<F>(std::move(f));
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QSCOPEGUARD_H
|
||||
@ -22,7 +22,7 @@ inline QWidget *mainwindow;
|
||||
inline std::function<void(QString)> MW_show_log;
|
||||
inline std::function<void(QString, QString)> MW_dialog_message;
|
||||
|
||||
// Dispatchers
|
||||
// Threading
|
||||
|
||||
class QThread;
|
||||
inline QThread *DS_cores;
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
#include "include/global/Utils.hpp"
|
||||
|
||||
#include "3rdparty/base64.h"
|
||||
#include "3rdparty/QThreadCreateThread.hpp"
|
||||
|
||||
#include <random>
|
||||
|
||||
@ -17,6 +16,7 @@
|
||||
#include <QRegularExpression>
|
||||
#include <QDateTime>
|
||||
#include <QLocale>
|
||||
#include <QThreadPool>
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#include "include/sys/windows/guihelper.h"
|
||||
@ -250,37 +250,15 @@ void ActivateWindow(QWidget *w) {
|
||||
}
|
||||
|
||||
void runOnUiThread(const std::function<void()> &callback) {
|
||||
// any thread
|
||||
auto *timer = new QTimer();
|
||||
auto thread = mainwindow->thread();
|
||||
timer->moveToThread(thread);
|
||||
timer->setSingleShot(true);
|
||||
QObject::connect(timer, &QTimer::timeout, [=]() {
|
||||
// main thread
|
||||
callback();
|
||||
timer->deleteLater();
|
||||
});
|
||||
QMetaObject::invokeMethod(timer, "start", Qt::QueuedConnection, Q_ARG(int, 0));
|
||||
QMetaObject::invokeMethod(mainwindow, callback);
|
||||
}
|
||||
|
||||
void runOnNewThread(const std::function<void()> &callback) {
|
||||
createQThread(callback)->start();
|
||||
QThreadPool::globalInstance()->start(callback);
|
||||
}
|
||||
|
||||
void runOnThread(const std::function<void()> &callback, QObject *parent) {
|
||||
auto *timer = new QTimer();
|
||||
auto thread = dynamic_cast<QThread *>(parent);
|
||||
if (thread == nullptr) {
|
||||
timer->moveToThread(parent->thread());
|
||||
} else {
|
||||
timer->moveToThread(thread);
|
||||
}
|
||||
timer->setSingleShot(true);
|
||||
QObject::connect(timer, &QTimer::timeout, [=]() {
|
||||
callback();
|
||||
timer->deleteLater();
|
||||
});
|
||||
QMetaObject::invokeMethod(timer, "start", Qt::QueuedConnection, Q_ARG(int, 0));
|
||||
QMetaObject::invokeMethod(parent, callback);
|
||||
}
|
||||
|
||||
void setTimeout(const std::function<void()> &callback, QObject *obj, int timeout) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user