QT开发中文网

qt怎么获取线程池中正在活跃也就是真在run的线程

在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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=8833

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?