mirror of
https://github.com/Mahdi-zarei/nekoray.git
synced 2025-12-19 05:30:06 +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)> MW_show_log;
|
||||||
inline std::function<void(QString, QString)> MW_dialog_message;
|
inline std::function<void(QString, QString)> MW_dialog_message;
|
||||||
|
|
||||||
// Dispatchers
|
// Threading
|
||||||
|
|
||||||
class QThread;
|
class QThread;
|
||||||
inline QThread *DS_cores;
|
inline QThread *DS_cores;
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
#include "include/global/Utils.hpp"
|
#include "include/global/Utils.hpp"
|
||||||
|
|
||||||
#include "3rdparty/base64.h"
|
#include "3rdparty/base64.h"
|
||||||
#include "3rdparty/QThreadCreateThread.hpp"
|
|
||||||
|
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
@ -17,6 +16,7 @@
|
|||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QLocale>
|
#include <QLocale>
|
||||||
|
#include <QThreadPool>
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include "include/sys/windows/guihelper.h"
|
#include "include/sys/windows/guihelper.h"
|
||||||
@ -250,37 +250,15 @@ void ActivateWindow(QWidget *w) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void runOnUiThread(const std::function<void()> &callback) {
|
void runOnUiThread(const std::function<void()> &callback) {
|
||||||
// any thread
|
QMetaObject::invokeMethod(mainwindow, callback);
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void runOnNewThread(const std::function<void()> &callback) {
|
void runOnNewThread(const std::function<void()> &callback) {
|
||||||
createQThread(callback)->start();
|
QThreadPool::globalInstance()->start(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void runOnThread(const std::function<void()> &callback, QObject *parent) {
|
void runOnThread(const std::function<void()> &callback, QObject *parent) {
|
||||||
auto *timer = new QTimer();
|
QMetaObject::invokeMethod(parent, callback);
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTimeout(const std::function<void()> &callback, QObject *obj, int timeout) {
|
void setTimeout(const std::function<void()> &callback, QObject *obj, int timeout) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user