Qt多執行緒間傳遞變數方法總結

2021-08-14 11:17:03 字數 3621 閱讀 8766

參考:

qt執行緒間共享資料主要有兩種方式:一是使用共享記憶體。即使用乙個兩個執行緒都能夠共享的變數(如全域性變數),這樣兩個執行緒都能夠訪問和修改該變數,從而達到共享資料的目的;二是使用singal/slot機制,把資料從乙個執行緒傳遞到另外乙個執行緒。

textdevice.h

#ifndef textdevice_h    

#define textdevice_h

#include #include #include class textdevice : public qthread ;

#endif // textdevice_h

textdevice.cpp

include #include #include #include "textdevice.h"     

textdevice::textdevice()

void textdevice::run()

void textdevice::stop()

void textdevice::write(const qstring& text)

textthread.h 

#ifndef textthread_h    

#define textthread_h

#include #include class textthread : public qthread ;

#endif // textthread_h

textthread.cpp 

#include "textthread.h"     

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

void textthread::stop()

void textthread::run()

}

main.cpp 

#include "textthread.h"

int main(int argc, char** argv)

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

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&");

textandnumber.h

#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

textandnumber.cpp

#include "textandnumber.h"     

textandnumber::textandnumber()

textandnumber::textandnumber(int count, qstring text)

int textandnumber::count()

qstring textandnumber::text()

textdevice.h

#ifndef textdevice_h     

#define textdevice_h

#include #include #include #include "textandnumber.h"

class textdevice : public qthread ;

#endif // textdevice_h

textdevice.cpp 

#include "textdevice.h"     

textdevice::textdevice() : qthread()

void textdevice::run()

void textdevice::stop()

void textdevice::write(textandnumber& tran)

textthread.h

#ifndef textthread_h     

#define textthread_h

#include #include #include "textandnumber.h"

class textthread : public qthread ;

#endif // textthread_h

textthread.cpp

#include "textthread.h"     

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

void textthread::run()

}

void textthread::stop()

main.cpp

#include "textdevice.h"

#include "textandnumber.h"

int main(int argc, char *argv)

shell與python間傳遞變數方法

python shell 1.環境變數 python view plain copy import os var 123 或var 123 os.environ var str var environ的鍵值必須是字串 os.system echo var 2.字串連線 python view pla...

JMETER 執行緒之間傳遞變數

首先我們不能把登入模組和交易的資訊寫在乙個執行緒組裡面,僅一次控制器,這個配件只是在乙個執行緒裡面生效 我們併發10個執行緒,迴圈5次,那麼就代表需要登入10次,和迴圈次數無關,但是這樣就達不到我們只登入一次的目的,那麼我們需要另闢思路,把登入模組放到乙個執行緒組裡面,然後把獲取登入的 token ...

QT多執行緒簡單實現及變數傳遞

自定義訊號與槽 qt多執行緒簡單實現 多執行緒間變數傳遞 主線程類 export key.h ifndef export key h define export key h include main widget.h namespace ui class texport work class exp...