You are on page 1of 12

Bi t p l n k thu t l p trnh

BI T P DI MN K THU T L P TRNH
bi s 7 Tm hi u s d ng th vi n boost::signals theo tutorial . Vi t ch thch Th Vi n Boost::Signals

2011

ng trnh m u v gi i

A) G i i t ng B) G i nhi u i t ng (Calling multiple slots) +K t n i nhi u i t ng (Connecting multiple slots) +G i cc i t ng th t theo nhm (Ordering slot call groups) C) Tham s i t ng (Slots Arguments) D) Qu n l k t n i (Connection Management) +Ng t k t n i ( disconnecting slots) +Ch n k t n i ( blocking slots) +K t n i t m th i (Scoped connections) +Ng t k t n i t ng ng (disconnecting equivalent slots) + i u ki n ng t k t n i +V d

1|P a ge

Bi t p l n k thu t l p trnh
A) G i m t it ng

2011

+Sau y l m t vi v d v s d ng signals v slots trong th vi n boost::signals -T o ra m t k hi u sig, k hi u ny khng c i s v khng tr v gi tr -K t n i i t ng(slots) v i k hi u sig v a t o trn b ng ph ng th c connect. -S d ng k hi u sig nh m t hm g i ra i t ng c k t n i b c 2.

V d :G i ra m t

it

ng(slots):

Code: #include "boost/signal.hpp" #include <iostream> //Khai bo ng d n th vi n //Khai bo th vi n hm vo ra it ng

int main() { struct XinChao // Khai bo c u trc { void operator()() const { std::cout << "Xin Chao Thay Tung ! << std::endl; } }; // T o ra m t k hi u sig boost::signal<void ()> sig; // K t n i v i i t XinChao a; sig.connect(a); // G i l i ton b sig(); return 0; } ng XinChao

it

ng k t n i

K t qu in ra mn hnh : Xin Chao Thay Tung !

2|P a ge

Bi t p l n k thu t l p trnh
B) G i nhi u it ng(slots):
it ng(slots)m t lc:

2011

+Ngoi ra th vi n boost::signal cn h tr g i nhi u Code: #include "boost/signal.hpp" #include <iostream> int main() { struct Anh { void operator()() const { std::cout << "Anh"; } }; struct Yeu { void operator()() const { std::cout << " Yeu"; } }; struct Em { void operator()() const { std::cout << " Em" << std::endl; } }; boost::signal<void ()> sig; sig.connect(Anh()); khi g i sig.connect(Yeu()); sig.connect(Em()); sig(); return 0; } K t qu in ra mn hnh l : Anh Yeu Em // C 3

//Khai bo ng d n th vi n //Khai bo th vi n hm vo ra //Khai bo c u trc it ng th nh t

//Khai bo c u trc

it

ng th hai

//Khai bo c u trc

it

ng th hai

it

ng cng it ng s

c n i v i m t k hi u sig nn u cg i

sig() th c 3

// Th t in ra mn hinh m c nh tun theo quy t c FIFO ( vo tr c ra tr c ra tr c )

3|P a ge

Bi t p l n k thu t l p trnh

2011

+G i cc

it

ng th t theo nhm:

Th vi n boost::signals cho php cc i t ng c t vo trong cc nhm c nh th t b ng cc s d ng nguyn. Khi bin d ch ch ng trnh s g i ra mn hnh theo th t cc nhm c nh s t th p n cao (0,1,2,3,.). Nh ng i t ng (slots) trong cng m t nhm th s tun theo quy t c FIFO. Code: #include "boost/signal.hpp" #include <iostream> int main() { struct Anh { void operator()() const { std::cout << " Anh "; } }; struct Yeu { void operator()() const { std::cout << " Yeu "; } }; struct Em { void operator()() const { std::cout << " Em "; } }; boost::signal<void ()> sig; sig.connect(1,Anh()); nhm sig.connect(0,Em()); sig.connect(0,Yeu()); sig(); return 0; }

//Khai bo ng d n th vi n //Khai bo th vi n hm vo ra //Khai bo c u trc it ng th nh t

//Khai bo c u trc

it

ng th hai

//Khai bo c u trc

it

ng th hai

//T o k hi u sig //K t n i it ng v i k hi u sig c s d ng nh s

K t qu in ra mn hnh: Em Yeu Anh

4|P a ge

Bi t p l n k thu t l p trnh

2011

C) Tham s

it

ng (Slot arguments)

Signals c th truy n tham s cho m t i t ng(slots) n g i. V d , ta t o ra m t k hi u sig v i 2 tham s ki u s th c cho i t ng(slots). Sau ta k t n i v i cc i t ng t ng(slots ) th khi ta truy n tham s cho sig . Ch ng trnh d ch s t ng g i tham s ny cho cc i t ng(slots) k t n i v i sig Code: #include "boost/signal.hpp" #include <iostream> void print_sum(float x, float y) hnh k t { std::cout << "The sum is " << x+y << std::endl; } void print_product(float x, float y) { std::cout << "The product is " << x*y << std::endl; } //Khai bo ng d n th vi n //Khai bo th vi n hm vo ra //Khai bo hm tnh t ng v in ra mn qu

//Khai bo hm tnh nhn v in ra mn hnh k t qu

void print_difference(float x, float y) //Khai bo hm tnh tr v in ra mn hnh k t { qu std::cout << "The difference is " << x-y << std::endl; } void print_quotient(float x, float y) //Khai bo hm tnh chia v in ra mn hnh k t { qu std::cout << "The quotient is " << x/y << std::endl; } int main() { boost::signal<void (float, float)> sig; sig.connect(&print_sum); sig.connect(&print_product); sig.connect(&print_difference); sig.connect(&print_quotient); sig(5, 3); return 0; } K t qu in ra mn hnh : The sum is 8 The product is 15 The difference is 2 The quotient is 1.6666 //Ch ng trnh chnh //T o ra k hi u sig ki u void v i 2 tham s u vo d ng s th c //K t n i k hi u sig v i cc hm php tnh c khai bo trn. B t k hm no k t n i v i sig c ng ph i c 2 tham s u vo d ng s th c //G i cc slots v i tham s (5,3)

5|P a ge

Bi t p l n k thu t l p trnh
D) Qu n l k t n i: 1)Ng t it ng ( Disconnecting Slots)

2011

i t ng(slots) khng t n t i v th i h n sau khi k t n i. Th ng th i t ng(slots) ch c s d ng cho m t s ki n no sau s ng t k t n i, cc l p trnh vin ph i ki m sot quy t nh khi no m t i t ng (slots) khng cn k t n i. Ch y u ta t p trung l p boost::signals::connection. L p k t n i duy nh t i di n cho cc k t n i gi a m t tn hi u c th v m t i t ng (slots). Ph ng th c connected() l ki m tra xem k hi u(signals) v i t ng (slots) cn c n i v i nhau khng. Ph ng th c disconnected() l ng t k t n i gi a k hi u(signals) v i t ng(slots) t i th i i m l nh c g i. M i cu c g i n ph ng th c connected() c a k hi u tr v m t i t ng k t n i, c th c s d ng xc nh n u k t n i v n cn t n t i ho c ng t k t n i k hi u(signal) v i t ng(slots).

Code:
#include "boost/signal.hpp" #include <iostream> //Khai bo ng d n th vi n //Khai bo th vi n hm vo ra it ng

int main() { struct XinChao // Khai bo c u trc { void operator()() const { std::cout << "Xin Chao Thay Tung !" << std::endl; } }; boost::signal<void ()> sig; boost::signals::connection c = sig.connect(XinChao()); if (c.connected()) { // C v n c n i v i k hi u sig(); // In ra mn hnh "Xin Chao Thay Tung !" } c.disconnect(); // Ng t i t ng XinChao assert(!c.connected()); //C khng cn b t k k t n i no sig(); // Khng hi n th do m t k t n i return 0; }

K t qu :
"Xin Chao Thay Tung !"

Nh n xt:
C hai l nh sig nh ng ch c m t dng k hi u b ng t c in ra do m t l nh g i khi k t n i gi a it ng v

6|P a ge

Bi t p l n k thu t l p trnh
2) Ch n it ng( Blocking slots)

2011

Khe c m c th c t m th i "b ch n", c ngh a r ng n s b b qua khi tn hi u c g i, nh ng khng b ng t k t n i. Ch c n ng ch n i t ng c th c gi i to thng qua m kha. y l m t v d v ch n / m kha i t ng:

Code:
#include "boost/signal.hpp" #include <iostream> //Khai bo ng d n th vi n //Khai bo th vi n hm vo ra it ng

int main() { struct XinChao // Khai bo c u trc { void operator()() const { std::cout << "Xin Chao Thay Tung !" << std::endl; } }; boost::signal<void ()> sig; boost::signals::connection c = sig.connect(XinChao()); sig(); // G i k hi u sig c.block(); // Ch n i t assert(c.blocked()); sig(); // G i k hi u sig ng

c.unblock(); // M kha i t sig(); // // G i k hi u sig return 0; }

ng

K t qu :
"Xin Chao Thay Tung !" "Xin Chao Thay Tung !"

Nh n xt: C 3 l nh g i sig nh ng ch c dng t ng b ch n c in ra mn hnh do c l nh g i trong qu trnh i

7|P a ge

Bi t p l n k thu t l p trnh
3)K t n i t m th i (Scoped connections)

2011

L k t n i gi a m t k hi u(signals) v m t i t ng(slots), n s b ng t khi k t qu g i c a ra mn hnh. Ch c n ng ny v cng h u ch khi n u b n ch c n s d ng t m th i m t k t n i no .

Code:
#include "boost/signal.hpp" #include <iostream> //Khai bo ng d n th vi n //Khai bo th vi n hm vo ra ng

int main() { struct XinChao // Khai bo c u trc i t { void operator()() const { std::cout << "Xin Chao Thay Tung !" << std::endl; } }; boost::signal<void ()> sig; { boost::signals::scoped_connection c = sig.connect(XinChao()); sig(); // G i i t ng } sig(); // G i i t ng return 0; } K t qu : "Xin Chao Thay Tung !" Nh n xt:

C 2 l nh g i sig() nh ng ch c m t dng c in ra do sau khi g i xong sig() th nh t k t n i l p t c b m t do v y khi g i sig() th hai s khng hi n trn mn output

4) Ng t

it

ng t

ng

ng (Disconnecting equivalent slots)

Ta c th ng t t ng ng cc i t ng b ng cch s d ng ph ng th c disconnect, mi n l cc lo i c a i t ng ch c n ng c cng ki u truy cp l operator

8|P a ge

Bi t p l n k thu t l p trnh
Code:
#include "boost/signal.hpp" #include <iostream> //Khai bo ng d n th vi n //Khai bo th vi n hm vo ra

2011

void print_sum(float x, float y) //Khai bo hm tnh t ng v in ra mn hnh k t qu { std::cout << "The sum is " << x+y << std::endl; } void print_product(float x, float y) //Khai bo hm tnh nhn v in ra mn hnh k t qu { std::cout << "The product is " << x*y << std::endl; } void print_difference(float x, float y) //Khai bo hm tnh tr v in ra mn hnh k t qu { std::cout << "The difference is " << x-y << std::endl; } void print_quotient(float x, float y) //Khai bo hm tnh chia v in ra mn hnh k t qu { std::cout << "The quotient is " << x/y << std::endl; } int main() { boost::signal<void (float, float)> sig; sig.connect(&print_sum); sig.connect(&print_product); sig.connect(&print_difference); sig.connect(&print_quotient); sig(5, 3); sig.disconnect(&print_sum); sig(5, 3); return 0; } //Ch ng trnh chnh //T o ra k hi u sig ki u void v i 2 tham s vo d ng s th c u

//K t n i k hi u sig v i cc hm php tnh c khai bo trn. B t k hm no k t n i v i sig c ng ph i c 2 tham s u vo d ng s th c //G i cc slots v i tham s (5,3) // Ng t k t n i t ng ng i t ng print_sum //G i cc slots v i tham s (5,3)

K t qu :
The sum is 8 The product is 15 The difference is 2 The quotient is 1.6666 The product is 15 The difference is 2 The quotient is 1.6666 Nh n xt: Do ta ng t k t n i c a ch cn 3 gi tr nh trn. it ng print_sum nn k t qu in ra sau l nh g i it ng sig(5,3) th hai

9|P a ge

Bi t p l n k thu t l p trnh
5) i u ki n x y ra ng t k t n i:
_ i u ki n x y ra ng t k t n i c th l m t trong s ci tr ng h p sau: + B ng t tr c ti p b i ph ng th c disconnect(), ho c gin ti p do ph (Scoped connections). +M t i t ng theo di rng bu c slots b h y. +K hi u b h y

2011

ng th c k t n i t m th i

_Nh ng s ki n ny c th x y ra b t c lc no m khng lm gin o n chu i g i cc k hi u. N u m t k t n i k hiu (signal) / i t ng(slots) b ng t b t c lc no trong qu trnh g i, qu trnh g i v n s ti p t c v khng g i nh ng i t ng m k t n i b ng t.

6)V d :

cv nb n cd cd i d ng text i d ng hex +

G m 2 ph n: + Code:

#include <iostream> #include <string> #include <boost/signal.hpp> #include <boost/bind.hpp> class Document { public: typedef boost::signal<void (bool)> signal_t; typedef boost::signals::connection connection_t; public: Document(){ } connection_t connect(signal_t::slot_function_type subscriber) { return m_sig.connect(subscriber); } void disconnect(connection_t subscriber) { subscriber.disconnect(); } void append(const char* s) { m_text += s; m_sig(true); } const std::string& getText() const { return m_text; }

10 | P a g e

Bi t p l n k thu t l p trnh
private: signal_t m_sig; std::string m_text; }; class View { public: View(Document& m) : m_document(m) { m_connection = m_document.connect(boost::bind(&View::refresh, this, _1)); } virtual ~View() { m_document.disconnect(m_connection); } virtual void refresh(bool bExtended) const = 0; protected: Document& m_document;

2011

private: Document::connection_t m_connection; }; class TextView : public View { public: TextView(Document& doc) : View(doc) {} virtual void refresh(bool bExtended) const { std::cout << "TextView: " << m_document.getText() << std::endl; } }; class HexView : public View { public: HexView(Document& doc) : View(doc) {} virtual void refresh(bool bExtended) const { const std::string& s = m_document.getText(); std::cout << "HexView:";

11 | P a g e

Bi t p l n k thu t l p trnh
for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) std::cout << ' ' << std::hex << static_cast<int>(*it); std::cout << std::endl; } }; int main(int argc, char* argv[]) { Document doc; TextView v1(doc); HexView v2(doc); doc.append(argc == 2 ? argv[1] : "Xin Chao Thay Tung"); return 0; }

2011

K t qu :

TextView: Xin Chao Thay Tung HexView: 58 69 6e 20 43 68 61 6f 20 54 68 61 79 20 54 75 6e 67 21

12 | P a g e

You might also like