signal-slot 信号槽技术初探1
signal-slot 信号槽技术初探一
信号槽技术由来已久, 早就听说在QT中大量应用,一起未曾研究, 最近要用到 libjingle, 看了相关文章和代码。它利用了模板技术将消息producer 和 consumer 进行解耦, 很好的简化了代码, 不说废话,让代码说话
#include <stdio.h> #include <stdlib.h> #include <string> #include <iostream> #include "sigslot.h" using namespace std; using namespace sigslot; //example 1 class Switch { public: void execute() {Clicked();} signal0<> Clicked; }; class Light : public has_slots<> { public: Light():state(false) {} void ToggleState() { state = !state; } void TurnOn() { state=true; }; void TurnOff() { state=false; }; void printState() { if(state) printf("on\n"); else printf("off\n"); } private: bool state; }; //example 2 class Sender { public: sigslot::signal2<string, std::time_t> SignalDanger; void Panic(){ SignalDanger("Help!", std::time(0)); } }; class Receiver : public sigslot::has_slots<> { public: Receiver(Sender& sender) { sender.SignalDanger.connect(this, &Receiver::OnDanger); } void OnDanger(string message, std::time_t time) { if(message == "Help!") cout<<"help when "<<time<<endl; } }; #ifdef __TEST_SIGSLOT__ int main(int argc, char* argv[]) #else int sigslot_usage(int argc, char* argv[]) #endif { //example 1 Switch sw1, sw2; Light lp1, lp2; sw1.Clicked.connect(&lp1, &Light::ToggleState); sw2.Clicked.connect(&lp2, &Light::ToggleState); lp1.printState(); sw1.execute(); lp1.printState(); lp2.printState(); sw2.execute(); lp2.printState(); //example 2 Sender sender; Receiver receiver(sender); sender.Panic(); return 0; }
Output:
off
on
off
on
help when 1349792830
以上代码根据其官方文档整理,sigslot.h 来自 http://sigslot.sourceforge.net/ , 很好用的库,就一个头文件, 接下来要看下它的内部实现