我對qt訊號阻塞的理解是:
通過訊號槽機制的方式呼叫函式
應用場景為多執行緒下子執行緒主動告知主線程某些資訊並等待主線程處理完資訊
下面來看**實現:
mythread.h/.cpp
1mainwindow.h/.cpp:2class mythread : public
qthread3;
1920
21mythread::mythread():
22_ptimer(nullptr)
2325
26 mythread::~mythread()
2732
this->quit();
33this->wait();34}
3536
void
mythread::run()
3743
44void
mythread::slttimer()
45
12、訊號槽鏈連線一定要寫成:connect(_ptimer,&qtimer::timeout,this,&mythread::slttimer);2class mainwindow : public
qwidget3;
1718
19 mainwindow::mainwindow(qwidget *parent) :
20qwidget(parent),
21 ui(new
ui::mainwindow)
2227
28 mainwindow::~mainwindow()
2932
3334
void mainwindow::sltreveice(int
icount)
35
如果寫成connect(_ptimer,signal(*),this,slot(*));形式會提示鏈結不到槽函式,原因應該是run函式是重寫父類qthread的,run裡的this指向的應該是qthread,而不是mythread。
3、執行緒中的定時器訊號槽鏈結引數一定要是qt::directconnection(訊號槽連線引數可以參考這個部落格:
4、一定要有q_object,巨集定義q_object
是任何實現訊號、槽或屬性的強制性要求。
上面的**執行結果:
如上圖所示,兩個執行緒的資料互動沒有什麼問題,但是如果我在主線程中sleep一下呢(模擬耗時函式)
在sltreveice()中新增usleep(1000);(linux下sleep標頭檔案:#include )
執行結果:
如上圖所示開始嚴重不同步了
ps:此處會不斷觸發,訊號會不斷排隊(應該僅在多執行緒的應用背景下有這種排隊的情況)
現在設定為阻塞connect(&_mythread,signal(slgtest(int)),this,slot(sltreveice(int)),qt::blockingqueuedconnection);
執行結果:
如上圖所示現在整齊排列了,子執行緒在等待主線程處理完成,回到開始說的「通過訊號槽機制的方式呼叫函式」,也就是說相當於子執行緒呼叫了乙個函式。
題外:上面提到了執行緒傳送的訊號不斷排隊的情況。
程式在上面程式中稍作改動
1、為mythread新增私有變數並在每次子執行緒定時器到的時候自增
2、mythread的私有變數在達到20的時候關閉定時器
3、為mythread新增獲取私有變數值的方法
此處不再展示**
**執行結果為:
如上圖所示定時器已經結束,但是主線程的槽函式依然在被觸發
此處處理方式是進入槽函式就斷開連線,退出函式時再連線(不再展示程式**和執行結果)
斷開連線函式:disconnect
ps斷開連線的方式:
1、大量斷開訊號與槽函式
斷開所有連線到某一物件的訊號槽:disconnect(myobject, 0, 0, 0);
myobject->disconnect();
斷開所有連線到某一訊號的訊號槽:disconnect(myobject, signal(mysignal()), 0, 0);
myobject->disconnect(signal(mysignal()));
斷開兩個物件之間的所有訊號槽關係:disconnect(myobject, 0, myreceiver, 0);
myobject->disconnect(myreceiver);
2、指定訊號簡潔斷開
qmetaobject::connection dis = connect(....); disconnect(dis);
sender()->disconnect();
簡化實現qt中的訊號阻塞blockSignals
qt中經常會用到blocksignals,且是成對出現,實現時常在函式的開始阻塞訊號,在函式的結尾釋放訊號。若裡面有大量需要阻塞的變數物件,這樣寫是件很麻煩的事,也比較多。如果能實現象下面的方式實現,這樣能簡化很多,且不關心釋放問題.void imeffectwidget slotslider in...
訊號的阻塞
訊號的阻塞就是讓系統暫時保留訊號留待以後傳送。注意 不是不傳送,而是延遲傳送 一般情況下訊號的阻塞只是暫時的,只是為了防止訊號打斷敏感的操作。1 訊號集 所有的訊號阻塞函式都使用稱作訊號集的資料結構來表明受到影響的訊號。每乙個操作都包括兩個階段 建立訊號集,傳遞訊號集給特定的庫函式。下面說明訊號集和...
訊號的阻塞
一.阻塞訊號 1.訊號的相關概念 1 遞達 實際執行訊號的處理動作稱為訊號的遞達 2 未決 訊號從產生到遞達之間的過程叫做訊號的未決 3 阻塞 程序可以選擇阻塞某個訊號,被阻塞的訊號產生時將保持在未決狀態,直到程序解除該訊號的遮蔽,才執行遞達動作.4 阻塞和忽略的不同 訊號被阻塞就不會被遞達,而訊號...