Qt 使用QThread 来管理线程。
要使用QThread开始一个线程,我们可以创建它的一个子类,然后覆盖其QThread::run()函数:
-
class Thread : public QThread
-
{
-
protected:
-
void run()
-
{
-
/* 线程的相关代码 */
-
}
-
};
然后我们这样使用新建的类来开始一个新的线程:
Thread *thread = new Thread;
thread->start(); // 使用 start() 开始新的线程
下面来看一个简单的例子:
-
class WorkerThread : public QThread
-
{
-
Q_OBJECT
-
public:
-
WorkerThread(QObject *parent = 0)
-
: QThread(parent)
-
{
-
}
-
protected:
-
void run()
-
{
-
for (int i = 0; i < 1000000000; i++);
-
emit done();
-
}
-
signals:
-
void done();
-
};
-
-
MainWindow::MainWindow(QWidget *parent)
-
: QMainWindow(parent)
-
{
-
QWidget *widget = new QWidget(this);
-
QVBoxLayout *layout = new QVBoxLayout;
-
widget->setLayout(layout);
-
lcdNumber = new QLCDNumber(this);
-
layout->addWidget(lcdNumber);
-
QPushButton *button = new QPushButton(tr("Start"), this);
-
layout->addWidget(button);
-
setCentralWidget(widget);
-
-
QTimer *timer = new QTimer(this);
-
connect(timer, &QTimer::timeout, [=]() {
-
static int sec = 0;
-
lcdNumber->display(QString::number(sec++));
-
});
-
-
WorkerThread *thread = new WorkerThread(this);
-
connect(thread, &WorkerThread::done, timer, &QTimer::stop);
-
connect(thread, &WorkerThread::finished, thread, &WorkerThread::deleteLater); //finished()信号是系统发出的
-
connect(button, &QPushButton::clicked, [=]() {
-
timer->start(1);
-
thread->start(); //使用QThread::start()函数启动一个线程
-
});
-
}
WorkerThread继承自QThread类,重写了其run()函数。我们可以认为,run()函数就是新的线程需要执行的代码。
阅读参考:
QT 多线程程序设计
返回目录:Qt学习整理
阅读(30385) | 评论(0) | 转发(3) |