|  | @@ -14,20 +14,31 @@
 | 
	
		
			
				|  |  |  // #include "fmt/std.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  | - * @brief   1、使用map存储工作线程,线程id作为键
 | 
	
		
			
				|  |  | - *          2、采用可变参数模板函数添加任务到任务队列中
 | 
	
		
			
				|  |  | - *          3、线程池采用单例模式
 | 
	
		
			
				|  |  | - *          4、有两种添加工作线程的方式,一种带有返回值,一种不带返回值
 | 
	
		
			
				|  |  | - * 
 | 
	
		
			
				|  |  | - * 使用方式:
 | 
	
		
			
				|  |  | - *     1、非成员函数 
 | 
	
		
			
				|  |  | - *          void func(int a, int b) { std::cout << a + b << std::endl; }
 | 
	
		
			
				|  |  | - *          CPPTP.add_task(func, 1, 2);
 | 
	
		
			
				|  |  | - *     2、成员函数 
 | 
	
		
			
				|  |  | - *          void A::func(int a, int b) { std::cout << a + b << std::endl; }
 | 
	
		
			
				|  |  | - *          A a;
 | 
	
		
			
				|  |  | - *          CPPTP.add_task(&A::func, &a, 1, 2);
 | 
	
		
			
				|  |  | - * 
 | 
	
		
			
				|  |  | +    说明:
 | 
	
		
			
				|  |  | +        1、使用map存储工作线程,线程id作为键
 | 
	
		
			
				|  |  | +        2、采用可变参数模板函数添加任务到任务队列中
 | 
	
		
			
				|  |  | +        3、线程池采用单例模式
 | 
	
		
			
				|  |  | +        4、有两种添加工作线程的方式,一种带有返回值,一种不带返回值
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | +    常规使用方式:
 | 
	
		
			
				|  |  | +        1、非成员函数 
 | 
	
		
			
				|  |  | +            void func(int a, int b) { std::cout << a + b << std::endl; }
 | 
	
		
			
				|  |  | +            CPPTP.add_task(func, 1, 2);
 | 
	
		
			
				|  |  | +        2、成员函数 
 | 
	
		
			
				|  |  | +            void A::func(int a, int b) { std::cout << a + b << std::endl; }
 | 
	
		
			
				|  |  | +            A a;
 | 
	
		
			
				|  |  | +            CPPTP.add_task(&A::func, &a, 1, 2);
 | 
	
		
			
				|  |  | +    Qt线程使用方式
 | 
	
		
			
				|  |  | +        1、Qt的事件循环需要掌控整个线程,因此需要创建一个QEventLoop然后执行exec()函数,将线程控制权交给Qt的事件循环,
 | 
	
		
			
				|  |  | +            这样才能正常使用信号和槽
 | 
	
		
			
				|  |  | +        2、线程归属权问题,QObject及子类有线程归属权问题,在哪个线程中创建的就归属于哪个线程,除非使用moveToThread()修改线程,
 | 
	
		
			
				|  |  | +            但是C++线程无法被move,所以推荐这个子线程使用一个壳函数作为线程功能函数,在线程函数中创建功能类,这样整个类的归属权都是子线程
 | 
	
		
			
				|  |  | +            class A;
 | 
	
		
			
				|  |  | +            void thread_task() { new A; }
 | 
	
		
			
				|  |  | +            CPPTP.add_task(thread_task);
 | 
	
		
			
				|  |  | +        3、如果功能类是单例或者全局变量,无法在线程创建之后new出来,在线程中连接信号和槽的时候设置为 Qt::DirectConnection ,
 | 
	
		
			
				|  |  | +            这样才能在子线程中调用槽函数,如QTimer的timeout()信号绑定的槽函数才会在子线程中运行
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define CPPTP ThreadPool::getInstance()
 |