最近用qt做乙個伺服器,眾所周知,qt的主線程必須保持暢通,才能重新整理ui。所以,網路通訊端採用新開執行緒的方式。
在涉及到使用子執行緒更新ui上的控制項時遇到了點兒麻煩。
網上提供了很多同一執行緒不同類間採用訊號槽通訊的方式,但是並不完全適合執行緒間的訊號槽通訊,這主要體現在自定義訊息的傳遞上。
首先我們看看一般的方式:
testthread.h 檔案
[cpp]view plain
copy
print?
#ifndef testthread_h
#define testthread_h
#include
#include "msg.h"
class
testthread :
public
qthread
; #endif // testthread_h
testthread.cpp檔案
[cpp]view plain
copy
print?
#include "testthread.h"
testthread::testthread(qobject *parent) :
qthread(parent)
void
testthread::run()
自己定義的類繼承了qthread類,重寫run函式,然後觸發testsignal訊號。
mainwindow.h
[cpp]view plain
copy
print?
#ifndef mainwindow_h
#define mainwindow_h
#include
#include "testthread.h"
namespace
ui
class
mainwindow :
public
qmainwindow
; #endif // mainwindow_h
mainwindow.cpp
[cpp]view plain
copy
print?
#include "mainwindow.h"
#include "ui_mainwindow.h"
mainwindow::mainwindow(qwidget *parent) :
qmainwindow(parent),
ui(new
ui::mainwindow)
void
mainwindow::displaymsg(
inta)
mainwindow::~mainwindow()
mainwindow裡面連線訊號槽,並且將收到的int引數顯示在介面上。
執行效果
下面我們對程式進行一些簡單,修改,使得它傳輸我們的自定義訊息。
testthread.h 檔案
[cpp]view plain
copy
print?
#ifndef testthread_h
#define testthread_h
#include
#include "msg.h"
class
testthread :
public
qthread
; #endif // testthread_h
testthread.h 檔案
[cpp]view plain
copy
print?
#include "testthread.h"
testthread::testthread(qobject *parent) :
qthread(parent)
void
testthread::run()
mainwindow.h 檔案
[cpp]view plain
copy
print?
#ifndef mainwindow_h
#define mainwindow_h
#include
#include "testthread.h"
#include "msg.h"
namespace
ui
class
mainwindow :
public
qmainwindow
; #endif // mainwindow_h
mainwindow.cpp 檔案
[cpp]view plain
copy
print?
#include "mainwindow.h"
#include "ui_mainwindow.h"
mainwindow::mainwindow(qwidget *parent) :
qmainwindow(parent),
ui(new
ui::mainwindow)
void
mainwindow::displaymsg(msg msg)
mainwindow::~mainwindow()
此時再進行編譯,能夠通過,但是qt creator會有提示
[cpp]view plain
copy
print?
qobject::connect: cannot queue arguments of type
'msg'
(make sure 'msg'
is registered
using
qregistermetatype().)
並且執行程式,不會有任何反應。
mainwindow.cpp檔案 改動為
[cpp]view plain
copy
print?
ui->setupui(
this
);
qregistermetatype("msg"
);
此時能夠正常執行
說明:
qt內生的元資料型別,如int double qstring 等
如果要用自己定義的資料型別,需要在connect前將其註冊為元資料型別。形式見**。
Qt執行緒間通訊 訊號與槽通訊
執行緒間通訊 1.自定義事件 postevent 2.訊號與槽 本質也是通過自定義事件實現的 注意 每個執行緒都有自己的事件迴圈 下面先說明下訊號與槽的通訊 下面這個程式的執行截圖 此程式的邏輯 主線程有乙個qprogressbar。有乙個子執行緒,把主線程裡面的qprogressbar傳入子執行緒...
Qt多執行緒基礎(三)子執行緒與主線程通訊
一 澄清概念 1.qt主線程 2.qt子執行緒 qt的子執行緒用於一些耗時操作,因此又被稱為工作執行緒。子執行緒不能用於直接重新整理介面 qwidget不可重入,qobject可重入 若子執行緒企圖修改介面控制項,可通過執行緒間通訊的方式 qt的訊號槽機制是跨執行緒的,因此可以用作執行緒間通訊。二 ...
QT中的多執行緒 與主線程通訊
今天回想研究生期間做的專案,用到了qt的多執行緒通訊,當時一點都不懂,就這照貓畫虎地寫,如今因為上次面試中問到了,覺得得好好準備下 主線程可以通過建立 qthread 子類物件開啟乙個新的執行緒,如果這些執行緒間需要相互通訊,它們可以使用共享變數,同時使用 mutexes,read write lo...