基本的な考え方
- 複数のスレッドを使用する必要性は、QThreadインスタンスを作成し、メインスレッドにおいて、
- QObjectのサブクラスの消費パッケージの動作は、(ワーカーワーク・クラスと呼ぶ)チャネル機能を継承。
- それらの間の関係を確立するQThreadインスタンスとワーカーインスタンス、シグナルとスロットを作成します。
- 労働者インスタンスmoveToThread(QThread *スレッド)関数を呼び出して、行くために作成したQThreadスレッドに移動します。
- 最後に、実行はQThreadスレッド()メソッドを起動します。
労働階級
worker.h
1 #ifndefのWORKER_H
2 の#define WORKER_H
3の#include <QObjectを>
4 クラスワーカー:公共QObjectを
5 {
6 Q_OBJECT
7 公共:
8 明示的な労働者(QObjectを*親= 0 )。
9つの 信号:
10 ボイド完全な();
11 公衆スロット:
12 ボイド doLongTimeWork(); // 耗时操作
13 }。
14 #endifの // WORKER_H
worker.cpp
1つの#include " worker.h "
2の#include <QDebug>
3の#include <QThread>
4ワーカー::ワーカー(QObjectを* 親):QObjectを(親)
5 {
6
7 }
8 ボイドワーカー:: doLongTimeWork()
9 {
10 qDebug()<< __ LINE __ __ << FUNCTION __ << " -入力してください" 。
11 qint64カウント= 100 。
12 一方(count-- ){
13 QThread :: msleep(10 )。
14 qDebug()<< __ LINE __ __ << FUNCTION __ << " 回数= " << 数えます。
15 }
16 EMITの完全な()。
17 qDebug()<< __ LINE __ __ << FUNCTION __ << " -休暇" 。
18 }
使用
1 void MainWindow::on_pushButtonDoWork_clicked()
2 {
3 Worker* worker = new Worker();
4 QThread* thread = new QThread();
5 //当线程启动时,执行Worker类的耗时函数doLongTimeWork()
6 connect(thread,SIGNAL(started()),worker,SLOT(doLongTimeWork()));
7 //当耗时函数执行完毕,发出complete()信号时,删除worker实例
8 connect(worker,SIGNAL(complete()),worker,SLOT(deleteLater()));
9 //当worker对象实例销毁时,退出线程
10 connect(worker,SIGNAL(destroyed(QObject*)),thread,SLOT(quit()));
11 //当线程结束时,销毁线程对象实例
12 connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
13 //移动worker对象实例到线程中
14 worker->moveToThread(thread);
15 //启动线程
16 thread->start();
17 }