mirror of
https://github.com/Mahdi-zarei/nekoray.git
synced 2025-12-18 20:50:09 +08:00
parent
446ff35866
commit
c9a99ac030
39
3rdparty/QThreadCreateThread.hpp
vendored
Normal file
39
3rdparty/QThreadCreateThread.hpp
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#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
Normal file
96
3rdparty/qscopeguard.h
vendored
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** 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;
|
||||||
|
|
||||||
// Threading
|
// Dispatchers
|
||||||
|
|
||||||
class QThread;
|
class QThread;
|
||||||
inline QThread *DS_cores;
|
inline QThread *DS_cores;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
#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>
|
||||||
|
|
||||||
@ -16,7 +17,6 @@
|
|||||||
#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,15 +250,37 @@ void ActivateWindow(QWidget *w) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void runOnUiThread(const std::function<void()> &callback) {
|
void runOnUiThread(const std::function<void()> &callback) {
|
||||||
QMetaObject::invokeMethod(mainwindow, 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
void runOnNewThread(const std::function<void()> &callback) {
|
void runOnNewThread(const std::function<void()> &callback) {
|
||||||
QThreadPool::globalInstance()->start(callback);
|
createQThread(callback)->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void runOnThread(const std::function<void()> &callback, QObject *parent) {
|
void runOnThread(const std::function<void()> &callback, QObject *parent) {
|
||||||
QMetaObject::invokeMethod(parent, callback);
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
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