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