OneThread.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef ONETHREAD_H
  2. #define ONETHREAD_H
  3. #include <QObject>
  4. #include <QTimer>
  5. #include <functional>
  6. #include <QThread>
  7. /**
  8. * 这个类提供了一种方便的线程调用方法,可以直接用信号将需要放入新线程
  9. * 运行的函数传递给这个类,然后就会在槽函数中运行这个函数
  10. * 使用方法:
  11. * 1. 创建一个OneThread对象,传入一个QThread对象,或者不传入,会自动创建一个QThread对象
  12. * 2. 使用addTask或者addTaskRunOne添加任务,addTask会进入循环,addTaskRunOne只会执行一次
  13. * 3. 不使用addTask,直接使用bindTask绑定函数和参数,手动触发信号,注意,触发信号前,要先开启子线程getThread()->start();
  14. *
  15. * 使用示例:
  16. * 1、非成员函数
  17. * void func(int a, int b) { std::cout << a + b << std::endl; }
  18. * thread.add_task(func, 1, 2);
  19. * 2、成员函数
  20. * void A::func(int a, int b) { std::cout << a + b << std::endl; }
  21. * A a;
  22. * thread.add_task(&A::func, &a, 1, 2);
  23. */
  24. class OneThread : public QObject
  25. {
  26. Q_OBJECT
  27. public:
  28. explicit OneThread(QThread* thread, QObject* parent = nullptr);
  29. explicit OneThread(QObject* parent = nullptr);
  30. ~OneThread();
  31. /* 获取子线程 */
  32. QThread* getThread() const { return m_thread; }
  33. /* 停止子线程 */
  34. void stopThread() { m_threadRunning = false; }
  35. /* 添加任务,开启子线程,这个会进入循环,不会退出,调用stopThread会停止线程 */
  36. template<typename F, typename... Args>
  37. void addTask(F&& f, Args&&... args)
  38. {
  39. if(!m_thread->isRunning())
  40. {
  41. m_thread->start();
  42. }
  43. std::function<void(void)> task = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
  44. emit signal_runTask(task);
  45. }
  46. /* 添加任务,开启子线程,这里只会执行一次 */
  47. template<typename F, typename... Args>
  48. void addTaskRunOne(F&& f, Args&&... args)
  49. {
  50. if(!m_thread->isRunning())
  51. {
  52. m_thread->start();
  53. }
  54. std::function<void(void)> task = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
  55. emit signal_runTaskRunOne(task);
  56. }
  57. /* 将函数与参数绑定 */
  58. template<typename F, typename... Args>
  59. std::function<void(void)> bindTask(F&& f, Args&&... args)
  60. {
  61. return std::bind(std::forward<F>(f), std::forward<Args>(args)...);
  62. }
  63. signals:
  64. void signal_runTask(std::function<void(void)> func);
  65. void signal_runTaskRunOne(std::function<void(void)> func);
  66. private slots:
  67. void do_runTask(std::function<void(void)> func);
  68. void do_runTaskRunOne(std::function<void(void)> func);
  69. private:
  70. bool m_threadRunning = false;
  71. QThread* m_thread = nullptr;
  72. QTimer m_timer; /* 定时器 */
  73. std::function<void(void)> m_func; /* 运行的函数 */
  74. };
  75. #endif // ONETHREAD_H