多執行緒的實現

2021-08-17 17:36:57 字數 2973 閱讀 3431

通常情況下,應用程式都是在乙個執行緒中執行操作。但是,當呼叫乙個耗時操作(例如,大批量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 上面...