HxUtils/HxTask.h

229 lines
7.1 KiB
C
Raw Normal View History

2024-01-25 18:37:25 +08:00
#ifndef HXTASK_H
2024-01-11 16:14:21 +08:00
#define HXTASK_H
#include "HxTrace.h"
#include <QtConcurrent>
class HxTask
{
public:
/**
* @brief
* @param uuid
*/
static void stop(QString uuid)
2024-01-11 16:14:21 +08:00
{
if (dispatchers.contains(uuid))
{
dispatchers[uuid] = false;
}
}
/**
* @brief
* @param functor , bool
* @param millisecond
*/
template <typename Functor>
static bool wait(Functor functor, int millisecond)
{
auto timestamp = QDateTime::currentDateTime();
while(!functor())
{
if (QDateTime::currentDateTime() > timestamp.addMSecs(millisecond))
return false;
QThread::msleep(10);
}
return true;
}
template <typename Functor, typename Arg1>
static QFuture<void> invoke(Functor functor, const Arg1 &arg1) { return QtConcurrent::run(functor, arg1); }
template <typename Functor, typename Arg1, typename Arg2>
static QFuture<void> invoke(Functor functor, const Arg1 &arg1, const Arg2 &arg2) { return QtConcurrent::run(functor, arg1, arg2); }
template <typename Functor, typename Arg1, typename Arg2, typename Arg3>
static QFuture<void> invoke(Functor functor, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3) { return QtConcurrent::run(functor, arg1, arg2, arg3); }
2024-01-11 16:14:21 +08:00
/**
* @brief
* @param functor
*/
template <typename Functor>
static QFuture<void> invoke(Functor functor) { return QtConcurrent::run(functor); }
/**
* @brief
* @param functor
* @param millisecond
* @param uuid
2024-01-11 16:14:21 +08:00
*/
template <typename Functor>
static void run(Functor functor, int millisecond, QString uuid)
2024-01-11 16:14:21 +08:00
{
dispatchers.insert(uuid, true);
QtConcurrent::run(
[=](Functor functor, int _millisecond, QString _uuid)
{
HxTrace::debug_write_line("HxTask", QString("Thread: %1, start").arg(_uuid));
while (dispatchers[_uuid])
{
functor();
QThread::msleep(_millisecond);
}
HxTrace::debug_write_line("HxTask", QString("Thread: %1, stop").arg(_uuid));
dispatchers.remove(_uuid);
},
functor, millisecond, uuid);
2024-01-11 16:14:21 +08:00
}
/**
* @brief
* @param object
* @param fn
*/
template <typename T, typename Class>
static void run(Class *object, T (Class::*fn)())
{
QtConcurrent::run(
[=](Class *_object, T (Class::*_fn)())
{
(_object->*_fn)();
},
object, fn);
}
/**
* @brief 线
* @param object
* @param fn
* @param millisecond
* @param uuid
2024-01-11 16:14:21 +08:00
*/
template <typename T, typename Class>
static void run(Class *object, T (Class::*fn)(), int millisecond, QString uuid)
2024-01-11 16:14:21 +08:00
{
dispatchers.insert(uuid, true);
QtConcurrent::run(
[=](Class *_object, T (Class::*_fn)(), int _millisecond, QString _uuid)
2024-01-11 16:14:21 +08:00
{
HxTrace::debug_write_line("HxTask", QString("Thread: %1, start").arg(_uuid));
2024-01-11 16:14:21 +08:00
while (dispatchers[_uuid])
{
(_object->*_fn)();
QThread::msleep(_millisecond);
}
HxTrace::debug_write_line("HxTask", QString("Thread: %1, stop").arg(_uuid));
2024-01-11 16:14:21 +08:00
dispatchers.remove(_uuid);
},
object, fn, millisecond, uuid);
2024-01-11 16:14:21 +08:00
}
/**
* @brief
* @param object
* @param fn1 1
* @param millisecond1 1
* @param fn2 2
* @param millisecond2 2
* @return
*/
template <typename T, typename Class>
static QUuid invoke(Class *object, T (Class::*fn1)(), int millisecond1, T (Class::*fn2)(), int millisecond2)
{
QUuid uuid = QUuid::createUuid();
HxTask::run(uuid, object, fn1, millisecond1);
HxTask::run(uuid, object, fn2, millisecond2);
return uuid;
}
/**
* @brief
* @param uuid
* @param object
* @param fn1 1
* @param millisecond1 1
* @param fn2 2
* @param millisecond2 2
* @return
*/
template <typename T, typename Class>
static void invoke(QUuid uuid, Class *object, T (Class::*fn1)(), int millisecond1, T (Class::*fn2)(), int millisecond2)
{
HxTask::run(uuid, object, fn1, millisecond1);
HxTask::run(uuid, object, fn2, millisecond2);
}
/**
* @brief
* @param object
* @param fn1 1
* @param millisecond1 1
* @param fn2 2
* @param millisecond2 2
* @param fn3 3
* @param millisecond3 3
* @return
*/
template <typename T, typename Class>
static QUuid invoke(Class *object, T (Class::*fn1)(), int millisecond1, T (Class::*fn2)(), int millisecond2, T (Class::*fn3)(), int millisecond3)
{
QUuid uuid = QUuid::createUuid();
HxTask::run(uuid, object, fn1, millisecond1);
HxTask::run(uuid, object, fn2, millisecond2);
HxTask::run(uuid, object, fn3, millisecond3);
return uuid;
}
/**
* @brief
* @param uuid
* @param object
* @param fn1 1
* @param millisecond1 1
* @param fn2 2
* @param millisecond2 2
* @param fn3 3
* @param millisecond3 3
* @return
*/
template <typename T, typename Class>
static void invoke(QUuid uuid, Class *object, T (Class::*fn1)(), int millisecond1, T (Class::*fn2)(), int millisecond2, T (Class::*fn3)(), int millisecond3)
{
HxTask::run(uuid, object, fn1, millisecond1);
HxTask::run(uuid, object, fn2, millisecond2);
HxTask::run(uuid, object, fn3, millisecond3);
}
private:
/**
* @brief mutex
*/
static QMutex mutex;
/**
* @brief dispatchers
*/
static QMap<QString, bool> dispatchers;
2024-01-11 16:14:21 +08:00
};
#endif // HXTASK_H