瀏覽代碼

V1.3.6
1、添加了Qt使用C++线程的说明

Apple 3 天之前
父節點
當前提交
28c5a9e753
共有 2 個文件被更改,包括 41 次插入17 次删除
  1. 25 14
      module/ThreadPool/ThreadPool.h
  2. 16 3
      module/mqtt/MQTTBase.h

+ 25 - 14
module/ThreadPool/ThreadPool.h

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

+ 16 - 3
module/mqtt/MQTTBase.h

@@ -9,9 +9,22 @@
 
 
 /**
- * 使用说明:
- *      1. 子类可以继承这个类,重新实现 recvMessage 函数,这个函数是接收到消息的回调函数
- *      2. 使用SPDLOG日志库,需要注册一个名为“MQTT”的logger
+    使用说明:
+        1. 子类可以继承这个类,重新实现 recvMessage 函数,这个函数是接收到消息的回调函数
+        2. 使用SPDLOG日志库,不需要设置日志记录器
+    
+    在C++线程池中使用注意事项:
+        1、这个库依赖的是Qt的网络库,所以需要依赖Qt的事件循环
+        2、如果线程是由C++创建的,需要将这个线程交给Qt的事件循环来管理,在线程中创建一个QEventLoop,然后执行
+           exec()函数,这样才能正常接收、发送消息
+        3、线程归属权问题,QObject及子类有线程归属权问题,在哪个线程中创建的就归属于哪个线程,除非使用moveToThread()修改线程,
+            但是C++线程无法被move,所以推荐这个子线程使用一个壳函数作为线程功能函数,在线程函数中创建功能类,这样整个类的归属权都是子线程
+            class A;
+            void thread_task() { new A; }
+            CPPTP.add_task(thread_task);
+        4、如果功能类是单例或者全局变量,无法在线程创建之后new出来,在线程中连接信号和槽的时候设置为Qt::DirectConnection,
+           这样才能在子线程中调用槽函数
+        5、MQTTBase及其子类,连接服务器的时候依赖信号和槽的返回,因此连接服务器最好在运行exec()之后进行。
  */