比特币源码研读(3)-main(2)
今天介绍noui_connect().
noui_connect()位于noui.cpp文件中,line52。该文件实现无操作界面情况下的信息连接。
void noui_connect()
{
// Connectbitcoind signal handlers
uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
uiInterface.ThreadSafeQuestion.connect(noui_ThreadSafeQuestion);
uiInterface.InitMessage.connect(noui_InitMessage);
}
分别处理消息弹出框,问题询问,消息初始化。
uiInterface是一个CClientUIInterface类,在ui_interface.h中声明,line27。
CClientUIInterface uiInterface;
下面,我们看CClientUIInterface中对ThreadSafeMessageBox,ThreadSafeQuestion
InitMessage三个变量的定义。已ThreadSafeMessageBox为例。
ThreadSafeMessageBox定义
boost::signals2::signal> ThreadSafeMessageBox;
抽象一下,就是boost::signals2::signalThreadSafeMessageBox
这里用到了信号/槽的概念,google了很多,但仍不太明白,试着按照我的理解做个说明。有理解错误的地方,希望大神指证。
信号槽定义:信号就是某个事件发生时,发出的通知(被观察者)给所有监听这个信息的函数(观察者)。槽是所有可能处理这个通知的函数(观察者)。当信号发生时,信号发出者有义务告诉(调用)所有对这个信息感兴趣的槽,说“我来了,你们看着办”。每个槽也可以同时监控多个信号,根据不同的信号进行不同的处理。因此,信号和槽是多对多的关系,一个信号可以给多个槽,一个槽也可以监控多个信号。
Signals2是基于boost的库函数,其中connect函数是插槽管理函数,它把插槽连接到信号上。
在看第一行代码:
uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
信号ThreadSafeMessageBox(下图中1),通过插槽管理函数connect(下图中的2)连接到槽noui_ThreadSafeMessageBox(下图中的3)上。
在反回去看定义,bool函数就是信号ThreadSafeMessageBox对应的槽必须具备的要求,bool值就是这个槽函数的返回值类型。即ThreadSafeMessageBox信号对应的槽函数应该是
bool (const std::string& message, const std::string& caption, unsigned int style),
这个槽函数的返回值类型是
boost::signals2::last_value
我们在看第一行代码
uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox);
noui_ThreadSafeMessageBox,定义在noui.cpp文件中, line15。
其函数定义static bool noui_ThreadSafeMessageBox(const std::string&
message, const std::string& caption, unsigned int style)。是不是与信号里的一致。
信号中要求的槽函数定义
noui_ThreadSafeMessageBox函数的输入变量
至此,noui_connect的信号流程算是了解了。
但对于信号/槽,signals库并不上很了解,尤其是里面常用的库函数
Connect函数,Disconnect函数等,并不熟悉,改天在仔细看看。
区块链研习社比特币源码研读班 electroman