|
@@ -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()
|