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 任务唯一编码
|
|
|
|
|
*/
|
2024-02-01 01:03:55 +08:00
|
|
|
|
static void stop(QString uuid)
|
2024-01-11 16:14:21 +08:00
|
|
|
|
{
|
|
|
|
|
if (dispatchers.contains(uuid))
|
|
|
|
|
{
|
|
|
|
|
dispatchers[uuid] = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-21 22:06:55 +08:00
|
|
|
|
/**
|
|
|
|
|
* @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 异步执行
|
2024-01-21 22:06:55 +08:00
|
|
|
|
* @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>
|
2024-02-01 01:03:55 +08:00
|
|
|
|
static void run(Functor functor, int millisecond, QString uuid)
|
2024-01-11 16:14:21 +08:00
|
|
|
|
{
|
2024-01-21 22:06:55 +08:00
|
|
|
|
dispatchers.insert(uuid, true);
|
|
|
|
|
|
|
|
|
|
QtConcurrent::run(
|
2024-02-01 01:03:55 +08:00
|
|
|
|
[=](Functor functor, int _millisecond, QString _uuid)
|
2024-01-21 22:06:55 +08:00
|
|
|
|
{
|
2024-02-01 01:03:55 +08:00
|
|
|
|
HxTrace::debug_write_line("HxTask", QString("Thread: %1, start").arg(_uuid));
|
2024-01-21 22:06:55 +08:00
|
|
|
|
|
|
|
|
|
while (dispatchers[_uuid])
|
|
|
|
|
{
|
|
|
|
|
functor();
|
|
|
|
|
|
|
|
|
|
QThread::msleep(_millisecond);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 01:03:55 +08:00
|
|
|
|
HxTrace::debug_write_line("HxTask", QString("Thread: %1, stop").arg(_uuid));
|
2024-01-21 22:06:55 +08:00
|
|
|
|
|
|
|
|
|
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 函数执行间隔频率,单位毫秒
|
2024-01-21 22:06:55 +08:00
|
|
|
|
* @param uuid 任务唯一编码
|
2024-01-11 16:14:21 +08:00
|
|
|
|
*/
|
|
|
|
|
template <typename T, typename Class>
|
2024-02-01 01:03:55 +08:00
|
|
|
|
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(
|
2024-02-01 01:03:55 +08:00
|
|
|
|
[=](Class *_object, T (Class::*_fn)(), int _millisecond, QString _uuid)
|
2024-01-11 16:14:21 +08:00
|
|
|
|
{
|
2024-02-01 01:03:55 +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);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 01:03:55 +08:00
|
|
|
|
HxTrace::debug_write_line("HxTask", QString("Thread: %1, stop").arg(_uuid));
|
2024-01-11 16:14:21 +08:00
|
|
|
|
|
|
|
|
|
dispatchers.remove(_uuid);
|
|
|
|
|
},
|
2024-01-21 22:06:55 +08:00
|
|
|
|
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
|
|
|
|
|
*/
|
2024-02-01 01:03:55 +08:00
|
|
|
|
static QMap<QString, bool> dispatchers;
|
2024-01-11 16:14:21 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // HXTASK_H
|