詳解 Qt 執行緒間共享資料

2021-06-20 03:28:44 字數 3197 閱讀 9323

使用共享記憶體。即使用乙個兩個執行緒都能夠共享的變數(如全域性變數),這樣兩個執行緒都能夠訪問和修改該變數,從而達到共享資料的目的。

qt 執行緒間共享資料是本文介紹的內容,多的不說,先來啃內容。qt執行緒間共享資料主要有兩種方式:

使用共享記憶體。即使用乙個兩個執行緒都能夠共享的變數(如全域性變數),這樣兩個執行緒都能夠訪問和修改該變數,從而達到共享資料的目的;

使用singal/slot機制,把資料從乙個執行緒傳遞到另外乙個執行緒。

第一種辦法在各個程式語言都使用普遍,而第二種方式倒是qt的特有方式,下面主要學習一下這種方式:

上面例子**可以看出兩個執行緒之間傳送了型別為qstring的資訊。像qstring等這些qt本身定義的型別,直接傳送即可。但如果是自己定義的型別如果想使用signal/slot來傳遞的話,則沒有這麼簡單。直接使用的話,會產生下面這種錯誤:

1

qobject::connect: cannot queue arguments of type

'textandnumber

'(make sure

'textandnumber'is

registed

using

qregistermetatype().)

原因:當乙個signal被放到佇列中(queued)時,它的引數(arguments)也會被一起一起放到佇列中(queued起來),這就意味著引數在被傳送到slot之前需要被拷貝、儲存在佇列中(queue)中;為了能夠在佇列中儲存這些引數(argument),qt需要去construct、destruct、copy這些物件,而為了讓qt知道怎樣去作這些事情,引數的型別需要使用qregistermetatype來註冊(如錯誤提示中的說明)

步驟:(以自定義textandnumber型別為例)

自定一種型別,在這個型別的頂部包含:#include

在型別定義完成後,加入宣告:q_declare_metatype(textandnumber);

在main()函式中註冊這種型別:qregistermetatype("textandnumber");

如果還希望使用這種型別的引用,可同樣要註冊:qregistermetatype("textandnumber&");

原因:當乙個signal被放到佇列中(queued)時,它的引數(arguments)也會被一起一起放到佇列中(queued起來),這就意味著引數在被傳送到slot之前需要被拷貝、儲存在佇列中(queue)中;為了能夠在佇列中儲存這些引數(argument),qt需要去construct、destruct、copy這些物件,而為了讓qt知道怎樣去作這些事情,引數的型別需要使用qregistermetatype來註冊(如錯誤提示中的說明)

步驟:(以自定義textandnumber型別為例)

自定一種型別,在這個型別的頂部包含:#include

在型別定義完成後,加入宣告:q_declare_metatype(textandnumber);

在main()函式中註冊這種型別:qregistermetatype("textandnumber");

如果還希望使用這種型別的引用,可同樣要註冊:qregistermetatype("textandnumber&");

view plaincopy to clipboardprint?  

#ifndef textandnumber_h     

#define textandnumber_h     

#include

//必須包含qmetatype,否則會出現下面錯誤:     

//error: expected constructor, destructor, or type conversion before 『;』 token     

#include

class textandnumber ;     

q_declare_metatype(textandnumber);     

#endif // textandnumber_h     

#include "textandnumber.h"     

textandnumber::textandnumber()     

textandnumber::textandnumber(int count, qstring text)     

int textandnumber::count()     

qstring textandnumber::text()     

#ifndef textdevice_h     

#define textdevice_h     

#include

#include

#include

#include "textandnumber.h"     

class textdevice : public qthread ;     

#endif // textdevice_h     

#include "textdevice.h"     

textdevice::textdevice() : qthread()     

void textdevice::run()     

void textdevice::stop()     

void textdevice::write(textandnumber& tran)     

#ifndef textthread_h     

#define textthread_h     

#include

#include

#include "textandnumber.h"     

class textthread : public qthread ;     

#endif // textthread_h     

#include "textthread.h"     

textthread::textthread(const qstring& text) : qthread()     

void textthread::run()     

}     

void textthread::stop()     

#include "textdevice.h"     

#include "textandnumber.h"     

int main(int argc, char *argv)     

Qt學習 執行緒間共享資料

qt執行緒間共享資料主要有兩種方式 第一種辦法在各個程式語言都使用普遍,而第二種方式倒是qt的特有方式,下面主要學習一下這種方式 c sharp view plain copy ifndef textdevice h define textdevice h include include inclu...

執行緒間共享資料

首先給大家分享乙個巨牛巨牛的人工智慧教程,是我無意中發現的。教程不僅零基礎,通俗易懂,而且非常風趣幽默,還時不時有內涵段子,像看 一樣,哈哈 我正在學習中,覺得太牛了,所以分享給大家!點這裡可以跳轉到教程 一 每個執行緒執行的 相同 若每個執行緒執行的 相同,共享資料就比較方便。可以使用同乙個run...

執行緒間的資料共享

執行緒間的資料共享可以通過兩種方式 通過thread子類建立程序的方法 通過runnable介面實現程序之間的共享 比較這兩種實現程序共享的區別 thread子類建立程序 package practice4 public class threadsale extends thread public ...