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
|