192 lines
5.7 KiB
C++
192 lines
5.7 KiB
C++
#ifndef HXTASK_H
|
||
#define HXTASK_H
|
||
|
||
#include "HxTrace.h"
|
||
//#include "HxThread.h"
|
||
|
||
#include <QtConcurrent>
|
||
|
||
class HxTask
|
||
{
|
||
public:
|
||
/**
|
||
* @brief 停止
|
||
* @param uuid 任务唯一编码
|
||
*/
|
||
static void stop(QUuid uuid)
|
||
{
|
||
if (dispatchers.contains(uuid))
|
||
{
|
||
dispatchers[uuid] = false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 异步执行
|
||
* @param object 操作对象类
|
||
* @param fn 操作对象类中的成员函数
|
||
*/
|
||
template <typename Functor>
|
||
static QFuture<void> invoke(Functor functor)
|
||
{
|
||
return QtConcurrent::run(functor);
|
||
}
|
||
|
||
/**
|
||
* @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 uuid 任务唯一编码
|
||
* @param object 操作对象类
|
||
* @param fn 操作对象类中的成员函数
|
||
* @param millisecond 函数执行间隔频率,单位毫秒
|
||
*/
|
||
template <typename T, typename Class>
|
||
static void run(QUuid uuid, Class *object, T (Class::*fn)(), int millisecond)
|
||
{
|
||
dispatchers.insert(uuid, true);
|
||
|
||
QtConcurrent::run(
|
||
[=](QUuid _uuid, Class *_object, T (Class::*_fn)(), int _millisecond)
|
||
{
|
||
HxTrace::debug_write_line("HxTask", QString("Thread: %1, start").arg(_uuid.toString()));
|
||
|
||
while (dispatchers[_uuid])
|
||
{
|
||
(_object->*_fn)();
|
||
|
||
QThread::msleep(_millisecond);
|
||
}
|
||
|
||
HxTrace::debug_write_line("HxTask", QString("Thread: %1, stop").arg(_uuid.toString()));
|
||
|
||
dispatchers.remove(_uuid);
|
||
},
|
||
uuid, object, fn, millisecond);
|
||
}
|
||
|
||
/**
|
||
* @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<QUuid, bool> dispatchers;
|
||
};
|
||
|
||
class HxParalle
|
||
{
|
||
public:
|
||
/**
|
||
* @brief 任务并行
|
||
* @param object 操作对象类
|
||
* @param fn1 操作对象类中的成员函数1
|
||
* @param fn2 操作对象类中的成员函数2
|
||
*/
|
||
template <typename T, typename Class>
|
||
static void invoke(Class *object, T (Class::*fn1)(), T (Class::*fn2)())
|
||
{
|
||
HxTask::run(object, fn1);
|
||
HxTask::run(object, fn2);
|
||
}
|
||
};
|
||
|
||
#endif // HXTASK_H
|