main 函數(shù)之2:noui_connect
// Connect bitcoind signal handlers
noui_connect();
說明是無界面情況(noui)下的信號連接
函數(shù)實現(xiàn)位于:Noui.cpp
void noui_connect()
{
// Connect bitcoind signal handlers
uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion);
uiInterface.InitMessage.connect( noui_ThreadSafeQuestion );
}
PS:uiInterface 屬于類CClientUIInterface帘营, 類定義位于:ui_interface.h
ThreadSafeMessageBox、ThreadSafeQuestion、InitMessage 為CClientUIInterface 的三個成員變量,使用connect 方法連接到槽函數(shù):noui_ThreadSafeMessageBox\noui_ThreadSafeQuestion\noui_ThreadSafeQuestion
這3個槽函數(shù)定義 :
/** Show message box. */
boost::signals2::signal<bool(const std::string& message, const std::string& caption, unsigned int style), boost::signals2::last_value> ThreadSafeMessageBox;
? /** If possible, ask the user a question. If not, falls back to ThreadSafeMessageBox(noninteractive_message, caption, style) and returns false. */? ? boost::signals2::signal> ThreadSafeQuestion;
? ? /** Progress message during initialization. */
? ? boost::signals2::signalInitMessage;
要理解noui_connec函數(shù),需要了解下QT編程 信號與槽的概念:
信號與槽
信號和槽是QT編程的基礎(chǔ)闲擦,簡單介紹 下它的機制:
槽和普通的C++成員函數(shù)幾乎一樣——可以是虛函數(shù);可以被重載;可以是公有的、保護的、私有的扫外,也可以被其他C++成員函數(shù)直接調(diào)用;它們的參數(shù)可以 是任意類型莉钙。
唯一不同是:槽還可以 與信號連接在一起:這種情況下, 每當(dāng)發(fā)射這個信號時,就會自動調(diào)用這個槽筛谚。
connect 語句:
connect(sender, SINGNAL(signal),receiver,SLOT(slot));
這里的sender 和receiver 是指向QObject 的指針磁玉,signal和slot 是不帶參數(shù)的函數(shù)名。SIGNAL() 與 SLOT() 是轉(zhuǎn)換信號與槽的宏驾讲。
特點:
一個信號可以連接多個槽
當(dāng)信號發(fā)射時蚊伞,會以不確定的順序一個接一個的調(diào)用各個槽。
多個信號可以連接同一個槽
即無論是哪一個信號被發(fā)射吮铭,都會調(diào)用這個槽时迫。
信號直接可以相互連接
發(fā)射第一個信號時,也會發(fā)射第二個信號谓晌。
連接可以被移除
這種情況用得比較少掠拳,因為在對象被刪除時,Qt會自動移除與這個對象相關(guān)的所有連接纸肉。語法如下:
disconnect(sender,SIGNAL(signal), receiver,SLOT(slot));
觀察者模式 Signals2
signals2基于Boost的另一個庫signals溺欧,實現(xiàn)了線程安全的觀察者模式。在signals2中柏肪,觀察者模式被稱為信號/插槽(signals and slots)姐刁,它是一種函數(shù)回調(diào)機制,一個信號關(guān)聯(lián)了多個插槽烦味,當(dāng)信號發(fā)出時聂使,所有關(guān)聯(lián)它的插槽都會被調(diào)用。
本程式中:
boost::signals2::signal<bool(const std::string& message, const std::string& caption, unsigned int style), boost::signals2::last_value> ThreadSafeMessageBox;
=>
ThreadSafeMessageBox (信號) 通過Connect方法谬俄, 連接了符合定義 為:bool(const std::string& message, const std::string& caption, unsigned int style), boost::signals2::last_value> 的槽函數(shù):noui_ThreadSafeMessageBox
其函數(shù)實現(xiàn)位于Noui.cpp:
同樣岩遗,可看 noui_ThreadSafeQuestion 和 noui_ThreadSafeQuestion的槽函數(shù)實現(xiàn):
分別表示:無對話框時,打印輸出消息類型(Error/Warning/Information)和消息內(nèi)容? 凤瘦、忽略用戶交互提示消息(與noui_ThreadSafeMessageBox 相同) 和 打印輸出程序初始化過程的消息 :
一 :noui_ThreadSafeMessageBox
(Show message box. )
style bit30 置為0
根據(jù)style的信息宿礁,添加標(biāo)題顯示 "error"或“warning”或“Infromation”到caption輸出
根據(jù)style bit30 的SECURE 信息,選擇print? Message 的方式
返回false
二:noui_ThreadSafeQuestion
(If possible, ask the user a question. If not, falls back to ThreadSafeMessageBox(noninteractive_message, caption, style) and returns false.)
詢問蔬芥,無詢問時操作實現(xiàn)同noui_ThreadSafeMessageBox梆靖, 同時返回false.
三:
noui_InitMessage:
打印出初始化時的信息
參考:
C++ GUI QT4 編程
區(qū)塊鏈研習(xí)社源碼研讀班 姝婧