requestthreadpool.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #ifndef REQUESTTHREADPOOL_H
  2. #define REQUESTTHREADPOOL_H
  3. #include <QObject>
  4. #include <QQueue>
  5. #include <QMutex>
  6. #include <QWaitCondition>
  7. #include <QThreadPool>
  8. #include <QRunnable>
  9. #include <functional>
  10. #include <memory>
  11. namespace TC {
  12. // 请求任务基类
  13. class RequestTask : public QObject, public QRunnable
  14. {
  15. Q_OBJECT
  16. public:
  17. RequestTask() : QObject(), QRunnable() {
  18. setAutoDelete(false);
  19. }
  20. virtual ~RequestTask() {}
  21. virtual void run() = 0;
  22. virtual bool retry() = 0;
  23. int retryCount() const { return m_retryCount; }
  24. void incrementRetryCount() { m_retryCount++; }
  25. void setMaxRetries(int maxRetries) { m_maxRetries = maxRetries; }
  26. int maxRetries() const { return m_maxRetries; }
  27. bool canRetry() const { return m_retryCount < m_maxRetries; }
  28. signals:
  29. void taskCompleted(bool success);
  30. void taskFailed();
  31. private:
  32. int m_retryCount = 0;
  33. int m_maxRetries = 3; // 默认最多重试3次
  34. };
  35. // 线程池管理类
  36. class RequestThreadPool : public QObject
  37. {
  38. Q_OBJECT
  39. public:
  40. static RequestThreadPool* instance();
  41. void addTask(std::shared_ptr<RequestTask> task);
  42. void setMaxThreadCount(int count);
  43. int activeThreadCount() const;
  44. private:
  45. RequestThreadPool(QObject* parent = nullptr);
  46. ~RequestThreadPool();
  47. void processNextTask();
  48. // 在 private slots: 部分修改
  49. private slots:
  50. void onTaskCompleted(bool success);
  51. void onTaskFailed(RequestTask* task); // 修改方法签名,接收任务指针作为参数
  52. private:
  53. static RequestThreadPool* s_instance;
  54. QThreadPool m_threadPool;
  55. QQueue<std::shared_ptr<RequestTask>> m_taskQueue;
  56. QMutex m_mutex;
  57. QWaitCondition m_condition;
  58. int m_activeTaskCount = 0;
  59. };
  60. } // namespace TC
  61. #endif // REQUESTTHREADPOOL_H