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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT的TCP通信使用线程池可以提高系统的并发性和响应性。通常情况下,使用单个线程来处理TCP通信可能会导致系统在处理大量连接时出现阻塞,影响系统的性能。 通过使用线程池,可以将TCP通信任务分配给多个线程来处理,从而使系统能够同时处理多个连接。线程池包含一组线程,这些线程在需要时可以立即执行任务。这样,可以确保每个连接都能获得足够的CPU时间,而不会被其他连接阻塞。 QT线程池机制可以方便地管理线程的生命周期,分配和回收线程资源。当一个连接建立时,可以从线程池中获取一个线程来处理该连接,当连接终止时,可以将线程归还给线程池。这种方式可以避免不断创建和销毁线程的开销,提高系统的效率。 通过使用线程池,还可以实现线程的复用。当一个连接完成任务后,并不立即销毁线程,而是将线程放回线程池,以供下一个连接使用。这样可以避免线程的频繁创建和销毁,减少系统的开销,提高系统的性能。 总而言之,QT的TCP通信使用线程池可以提高系统的并发性和响应性,减少线程的创建和销毁开销,提高系统的性能和效率。 ### 回答2: 在Qt中,TCP通信可以使用线程池来实现。线程池是一种管理和调度多个线程的机制,可以有效地利用系统资源并提高程序的性能。 在使用Qt进行TCP通信时,我们可以使用QtQtConcurrent模块配合线程池来处理通信任务。QtConcurrent模块提供了一些方便的类和函数来进行并行编程,其中就包括了线程池。 首先,我们需要创建一个线程池对象,并指定线程池中的线程数量。可以根据需要来调整线程数量,以避免线程过多或过少造成的资源浪费或程序性能下降。 然后,我们可以使用QtConcurrent::run()函数来将需要执行的通信任务放入线程池中执行。该函数接受一个函数指针或lambda表达式作为参数,用于指定要执行的任务。同时,我们还可以通过该函数的返回值来获取任务的执行结果。 在通信任务中,我们可以使用QtQTcpSocket类来进行TCP通信操作。比如,可以使用QTcpSocket的connectToHost()函数来连接到服务器,使用write()函数来发送数据,使用read()函数来接收数据等等。 通过使用线程池,我们可以将通信任务分配给多个线程同时处理,提高了程序的并发性能。同时,线程池还可以根据系统资源的使用情况动态调整线程数量,以避免资源浪费和程序性能下降。 总之,通过在Qt使用线程池来处理TCP通信,可以提高程序的性能和并发能力,同时还可以好地利用系统资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值