QT开发中文网

还有一种方式

除了使用QThread类来创建线程,Qt还提供了另一种方式来管理线程:信号与槽机制。

在这种方式中,我们可以创建一个QObject子类的对象,并将其移动到一个新的线程中。然后,使用信号和槽连接来实现线程之间的通信。以下是一个示例:

#include <QCoreApplication>
#include <QThread>
#include <QDebug>

class Worker : public QObject {
    Q_OBJECT

public:
    void doWork() {
        qDebug() << "Worker thread ID:" << QThread::currentThreadId();
        
        // 模拟耗时操作
        for (int i = 0; i < 5; ++i) {
            qDebug() << "Working...";
            QThread::sleep(1);
        }
        
        emit workFinished();
    }

signals:
    void workFinished();
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);
    
    // 创建工作线程
    QThread* workerThread = new QThread;
    
    // 创建工作对象并移动到工作线程
    Worker* worker = new Worker;
    worker->moveToThread(workerThread);
    
    // 连接信号与槽
    QObject::connect(worker, &Worker::workFinished, &app, &QCoreApplication::quit);
    
    // 启动工作线程
    workerThread->start();
    
    qDebug() << "Main thread ID:" << QThread::currentThreadId();
    
    // 发送任务给工作对象执行
    QMetaObject::invokeMethod(worker, "doWork", Qt::QueuedConnection);
    
    return app.exec();
}

#include "main.moc"

在上面的示例中,我们创建了一个Worker类作为工作对象。它继承自QObject,并定义了一个doWork方法来执行具体的工作任务。通过信号workFinished,工作线程通知主线程任务完成。

在主函数中,我们创建了一个新的QThread对象workerThread,并将worker对象移动到该线程中。然后,使用QObject::connect函数连接信号和槽,当工作对象发出workFinished信号时,触发QCoreApplication::quit槽函数退出应用程序。

最后,启动工作线程并发送任务给工作对象执行。

无论是使用QThread还是信号与槽机制来创建线程,在多线程编程中都需要注意避免资源竞争和并发问题,并合理处理共享数据的访问。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?