当前位置: 代码迷 >> 综合 >> Qt更方便的使用线程池
  详细解决方案

Qt更方便的使用线程池

热度:96   发布时间:2024-02-08 19:32:27.0

使用Qt的线程池必须继承QRunnable这样有的时候用起来很麻烦

#include <memory>
#include <functional>
#include <QRunnable>class CThreadPoolTask : public QRunnable
{
private:CThreadPoolTask(std::function<void()> funRun) : m_funRun(funRun) {}
public://成员函数的对象时共享指针template<class Y, class T>static CThreadPoolTask* CreateTask(Y y, std::shared_ptr<T> obj){return new CThreadPoolTask(std::bind(y, obj.get()));}template<class Y, class T, class A>static CThreadPoolTask* CreateTask(Y y, std::shared_ptr<T> obj, A a){return new CThreadPoolTask(std::bind(y, obj, a));}template<class Y>static CThreadPoolTask* CreateTask(Y y){return new CThreadPoolTask(std::bind(y));}template<class Y, class A>static CThreadPoolTask* CreateTask(Y y, A a){return new CThreadPoolTask(std::bind(y, a));}template<class Y, class A, class A1>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1){return new CThreadPoolTask(std::bind(y, a, a1));}template<class Y, class A, class A1, class A2>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2){return new CThreadPoolTask(std::bind(y, a, a1, a2));}template<class Y, class A, class A1, class A2, class A3>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2, A3 a3){return new CThreadPoolTask(std::bind(y, a, a1, a2, a3));}template<class Y, class A, class A1, class A2, class A3, class A4>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2, A3 a3, A4 a4){return new CThreadPoolTask(std::bind(y, a, a1, a2, a3, a4));}template<class Y, class A, class A1, class A2, class A3, class A4, class A5>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5){return new CThreadPoolTask(std::bind(y, a, a1, a2, a3, a4, a5));}template<class Y, class A, class A1, class A2, class A3, class A4, class A5, class A6>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6){return new CThreadPoolTask(std::bind(y, a, a1, a2, a3, a4, a5, a6));}template<class Y, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7){return new CThreadPoolTask(std::bind(y, a, a1, a2, a3, a4, a5, a6, a7));}template<class Y, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8){return new CThreadPoolTask(std::bind(y, a, a1, a2, a3, a4, a5, a6, a7, a8));}template<class Y, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>static CThreadPoolTask* CreateTask(Y y, A a, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9){return new CThreadPoolTask(std::bind(y, a, a1, a2, a3, a4, a5, a6, a7, a8, a9));}virtual void run(){m_funRun();}private:std::function<void()> m_funRun;
};

 

使用的例子

	//成员函数QThreadPool::globalInstance()->start(CThreadPoolTask::CreateTask(&CMainWindow::test, this));//成员函数带参数QThreadPool::globalInstance()->start(CThreadPoolTask::CreateTask(&CMainWindow::test1, this, 10));//普通函数QThreadPool::globalInstance()->start(CThreadPoolTask::CreateTask(MyPrint));//lambda表达式QThreadPool::globalInstance()->start(CThreadPoolTask::CreateTask([]() { qDebug() << "lambda"; }));

 

  相关解决方案