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/ , 很好用的库,就一个头文件, 接下来要看下它的内部实现