C++ QThread线程池

C++ QThread线程池,c++,qt,threadpool,C++,Qt,Threadpool,我正在尝试用QThread编写线程轮询 class ThreadPool: public QObject { Q_OBJECT public: ThreadPool(int maxThreads); void addTask(MyTask *task); private: int maxThreads; QMutex mutex; QVector<QPair<bool, QThread>> threads; QTh

我正在尝试用QThread编写线程轮询

class ThreadPool: public QObject
{
    Q_OBJECT

public:
    ThreadPool(int maxThreads);
    void addTask(MyTask *task);
private:
    int maxThreads;
    QMutex mutex;
    QVector<QPair<bool, QThread>> threads;
    QThread *getFreeThread();
public slots:
   void freeThread();
};


void ThreadPool::addTask(MyTask* task)
{
    QThread *thread = getFreeThread();
    task->moveToThread(thread);
    connect(thread, SIGNAL(started()), task, SLOT(doWork()));
    connect(task, SIGNAL(workFinished()), thread, SLOT(quit()));
    connect(thread, SIGNAL(finished()), task, SLOT(deleteLater()));
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    connect(thread, SIGNAL(finished()), this, SLOT(freeThread()));
    thread->start();
}
类线程池:公共QObject
{
Q_对象
公众:
线程池(int-maxThreads);
void addTask(MyTask*task);
私人:
int最大线程;
QMutex互斥;
QVector线程;
QThread*getFreeThread();
公众时段:
void freeThread();
};
void ThreadPool::addTask(MyTask*task)
{
QThread*thread=getFreeThread();
任务->移动到线程(线程);
连接(线程、信号(已启动())、任务、插槽(doWork());
连接(任务、信号(workFinished())、线程、插槽(quit());
连接(线程、信号(finished())、任务、插槽(deleteLater());
连接(线程、信号(finished())、线程、插槽(deleteLater());
连接(线程,信号(finished()),此,插槽(freeThread());
线程->开始();
}
我正在创建数量有限的线程来执行任务。 但是,我不明白如何获得释放线程的数量。 我知道QThreadPool和Qtconcurrent,但我不想使用它。 也许,值得注意的是,QPair向量中的每个线程是否是自由的

  • 您实际上不需要使用
    QVector
    来跟踪池中的所有线程,而是使用
    QList
    只保存指向空闲线程的指针

    private:
         QList<QThread*> freeThreads; // only free threads
         QList<QThread*> allThreads; // just to count the number of all threads
    
  • 您实际上不需要使用
    QVector
    来跟踪池中的所有线程,而是使用
    QList
    只保存指向空闲线程的指针

    private:
         QList<QThread*> freeThreads; // only free threads
         QList<QThread*> allThreads; // just to count the number of all threads
    

    为了完整性起见,存在一个可以使用的QThreadPool类。为了完整性起见,存在一个可以使用的QThreadPool类。
    QThread* getFreeThread()
    {
         if( ! freeThreads.isEmpty() )
         {
              // take the first free thread
              return freeThreads.takeFirst();
         }
         else
         {
              if(allThreads.size() < maxThreads )
              {
                 // create a new thread 
                 QThread* thread = new QThread(this);
                 allThreads << thread;
                 return thread;
              }
              else
              {
                // Maximum number of threads exceeded 
                // and no free thread is available
                 return NULL;
              }
         }
    
    }
    
    void ThreadPool::addTask(MyTask* task)
    {
        QThread *thread = getFreeThread();
        if( ! thread )
        {
            // do something else
            return;
        }
        // proceed with thread execution ...
    }