在Qt中,QThreadPool
并没有直接提供获取线程池中正在活跃的线程的方法。但是你可以通过一些间接的方式来实现。
一种方式是通过继承QRunnable
类,并重写其run()
函数,在函数中添加相应的逻辑来追踪线程的执行状态。下面是一个示例:
#include <QCoreApplication>
#include <QDebug>
#include <QRunnable>
#include <QThread>
#include <QThreadPool>
class MyTask : public QRunnable {
public:
void run() override {
qDebug() << "Task is running in thread:" << QThread::currentThreadId();
// 线程正在运行
emit threadRunning(QThread::currentThreadId());
// 模拟耗时操作
for (int i = 0; i < 1000000000; ++i) {}
// 线程已完成
emit threadFinished(QThread::currentThreadId());
}
signals:
void threadRunning(Qt::HANDLE threadId);
void threadFinished(Qt::HANDLE threadId);
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QThreadPool* pool = QThreadPool::globalInstance();
QList<QThread*> activeThreads;
QObject worker;
// 连接任务的信号与槽函数
QObject::connect(&worker, &MyTask::threadRunning, [&activeThreads](Qt::HANDLE threadId) {
QMutexLocker locker(&pool->mutex());
if (!activeThreads.contains(QThread::currentThread())) {
activeThreads.append(QThread::currentThread());
qDebug() << "New active thread:" << threadId;
}
});
QObject::connect(&worker, &MyTask::threadFinished, [&activeThreads](Qt::HANDLE threadId) {
QMutexLocker locker(&pool->mutex());
activeThreads.removeOne(QThread::currentThread());
qDebug() << "Thread finished:" << threadId;
});
// 提交任务到线程池
for (int i = 0; i < 5; ++i) {
MyTask* task = new MyTask();
pool->start(task);
}
return a.exec();
}
在这个示例中,我们创建了一个MyTask
类来表示要执行的任务。在run()
函数中,我们发出了两个自定义信号:threadRunning()
和threadFinished()
,分别表示线程开始运行和线程完成运行。
在主函数中,我们创建了一个全局的线程池对象,并使用QThreadPool::globalInstance()
方法获取它的实例。然后我们定义了一个activeThreads
列表来存储当前正在活跃的线程。
通过连接任务对象的信号与槽函数,在每个线程开始运行时,将其添加到activeThreads
列表中,在线程完成时将其从列表中移除。
注意,在多线程编程中,需要注意对共享资源(如列表)进行互斥访问以避免竞争条件。在示例中,我们使用了一个互斥锁来保护对活跃线程列表的访问。
通过这种方式,你可以实现获取正在活跃运行的线程的功能。
内容由零声教学AI助手提供,问题来源于学员提问