#ifndef HXTASK_H #define HXTASK_H #include "HxTrace.h" //#include "HxThread.h" #include class HxTask { public: /** * @brief 停止 * @param uuid 任务唯一编码 */ static void stop(QUuid uuid) { if (dispatchers.contains(uuid)) { dispatchers[uuid] = false; } } /** * @brief 异步执行 * @param object 操作对象类 * @param fn 操作对象类中的成员函数 */ template static QFuture invoke(Functor functor) { return QtConcurrent::run(functor); } /** * @brief 异步执行 * @param object 操作对象类 * @param fn 操作对象类中的成员函数 */ template 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 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 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 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 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 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 dispatchers; }; class HxParalle { public: /** * @brief 任务并行 * @param object 操作对象类 * @param fn1 操作对象类中的成员函数1 * @param fn2 操作对象类中的成员函数2 */ template static void invoke(Class *object, T (Class::*fn1)(), T (Class::*fn2)()) { HxTask::run(object, fn1); HxTask::run(object, fn2); } }; #endif // HXTASK_H