通常情況下,應用程式都是在乙個執行緒中執行操作。但是,當呼叫乙個耗時操作(例如,大批量i/o或大量矩陣變換等cpu密集操作)時,使用者介面常常會凍結。而使用多執行緒可以解決這一問題。
qt有兩種多執行緒的方法,一種是繼承qthread的run函式;另外一種是把乙個繼承於qobject的類轉移到乙個thread裡。
直接來乙個例項,例項主要是實現了在乙個定時器開始之前,執行了一些複雜的資料計算(這裡是直接sleep 五秒)
mythread.h
#ifndef mythread_h
#define mythread_h
#include
#include
class mythread : public qthread
;#endif // mythread_h
mywidget.h
#ifndef mywidget_h
#define mywidget_h
#include "mythread.h"
#include
#include //定時器標頭檔案
namespace ui
class mywidget : public qwidget
;#endif // mywidget_h
mythread.cpp
#include "mythread.h"
mythread::mythread(qobject *parent) : qthread(parent)
void mythread::run()
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include
#include
mywidget::mywidget(qwidget *parent) :
qwidget(parent),
ui(new ui::mywidget)
void mywidget::stopthread()
void mywidget::dealdone()
void mywidget::dealtimeout()
mywidget::~mywidget()
void mywidget::on_pushbutton_clicked()
//啟動執行緒,處理資料
thread->start();
}
執行結果如圖所示:五秒之後定時器停止。
注意:
主要思路:
mythread.h
#ifndef mythread_h
#define mythread_h
#include
class mythread : public qobject
;#endif // mythread_h
mywidget.h
#ifndef mywidget_h
#define mywidget_h
#include
#include "mythread.h"
#include
namespace ui
class mywidget : public qwidget
;#endif // mywidget_h
mythread.cpp
#include "mythread.h"
#include
#include
//#include
mythread::mythread(qobject *parent) : qobject(parent)
void mythread::mytimeout()
}}void mythread::setflag(bool flag)
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include
mywidget::mywidget(qwidget *parent) :
qwidget(parent),
ui(new ui::mywidget)
mywidget::~mywidget()
void mywidget::dealclose()
void mywidget::dealsignal()
void mywidget::on_pushbuttonstart_clicked()
//啟動執行緒,但是沒有啟動執行緒處理函式
thread->start();
myt->setflag(false);
//不能直接呼叫執行緒處理函式,
//直接呼叫導致執行緒處理函式和主線程是在同乙個執行緒
// myt->mytimeout();
//只能通過signal-slot方式呼叫
emit startthread();
}//關閉
void mywidget::on_pushbutton_2_clicked()
myt->setflag(true);
thread->quit();
thread->wait();
}
【參考部落格】qt使用多執行緒的一些心得
示例**(day05 資料夾下面):
多執行緒的實現
include include include include include include include include include include include void client void arg connfd else if ret 0 printf buf s n buf r...
多執行緒 實現多執行緒的幾種方式
public class mythread extends thread mythread mythread1 newmythread mythread mythread2 newmythread mythread1.start mythread2.start public class mythre...
(40)多執行緒 實現多執行緒方法
建立執行緒用法 1.繼承thread,重寫run 方法,建立子類物件 a a new a 執行緒開始執行 a.start 2.實現runnable介面,實現run 方法,建立實現類物件 a a new a 建立 類物件 thread t new thread a 執行緒開始執行 t.start 上面...