比特币源码研读(3)-main(2)steemCreated with Sketch.

in #btc7 years ago

今天介绍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)上。

1.png

在反回去看定义,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)。是不是与信号里的一致。

2.png

信号中要求的槽函数定义

3.png

noui_ThreadSafeMessageBox函数的输入变量

至此,noui_connect的信号流程算是了解了。

但对于信号/槽,signals库并不上很了解,尤其是里面常用的库函数

Connect函数,Disconnect函数等,并不熟悉,改天在仔细看看。

区块链研习社比特币源码研读班 electroman

Coin Marketplace

STEEM 0.26
TRX 0.20
JST 0.038
BTC 96240.27
ETH 3591.45
USDT 1.00
SBD 3.91