Qt更方便的使用线程池

使用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"; }));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值