HxUtils/HxTask.h
2024-01-11 16:14:21 +08:00

192 lines
5.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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