You are on page 1of 18

BI TP DI MN K THUT LP TRNH Tm hiu s dng th vin boost::signals theo tutorial .

Vit chng trnh mu v gii thch

Sinh vin thc hin: Phm Quang Sng Lp K T ng Ha 6- K55 SHSV 20106041

I.

Th Vin Boost::Signals

A) Gi i tng B) Gi nhiu i tng (Calling multiple slots) +Kt ni nhiu i tng (Connecting multiple slots) +Gi cc i tng th t theo nhm (Ordering slot call groups) C) Tham s i tng (Slots Arguments) D) Qun l kt ni (Connection Management) +Ngt kt ni ( disconnecting slots) +Chn kt ni ( blocking slots) +Kt ni tm thi (Scoped connections) +Ngt kt ni tng ng (disconnecting equivalent slots) +iu kin ngt kt ni +Chng trnh v d A) Gi mt i tng +Sau y l mt vi v d v s dng signals v slots trong th vin boost::signals -To ra mt k hiu sig, k hiu ny khng c i s v khng tr v gi tr -Kt ni i tng(slots) vi k hiu sig va to trn bng phng thc connect. -S dng k hiu sig nh mt hm gi ra i tng c kt ni bc 2. V d :Gi ra mt i tng(slots): #include "boost/signal.hpp" #include <iostream> int main() { struct XinChao // Khai bo cu trc i tng { void operator()() const { std::cout << "Xin Chao Thay Tung ! << std::endl; }

}; // To ra mt k hiu sig boost::signal<void ()> sig; // Kt ni vi i tng XinChao XinChao a; sig.connect(a); // Gi li ton b i tng kt ni sig(); return 0; } Kt qu in ra mn hnh : Xin Chao Thay Tung ! //Khai bo ng dn th vin //Khai bo th vin hm vo ra B) Gi nhiu i tng(slots): +Ngoi ra th vin boost::signal cn h tr gi nhiu i tng(slots)mt lc: Code: #include "boost/signal.hpp" #include <iostream> int main() { struct Thay { void operator()() const { std::cout << "Thay"; } }; struct Tung

{ void operator()() const { std::cout << " Tung"; } }; struct Handsome { void operator()() const { std::cout << " Handsome" << std::endl; } }; boost::signal<void ()> sig; sig.connect(Thay()); khi gi sig.connect(Tung()); sig.connect(Handsome()); //Khai bo ng dn th vin //Khai bo th vin hm vo ra //Khai bo cu trc i tng th nht //Khai bo cu trc i tng th hai //Khai bo cu trc i tng th hai // C 3 i tng cng c ni vi mt k hiu sig nn sig() th c 3 i tng s u c gi Kt qu in ra mn hnh l : Thay Tung Handsome // Th t in ra mn hinh mc nh tun theo quy tc FIFO ( vo trc ra trc ra trc )

+Gi cc i tng th t theo nhm: Th vin boost::signals cho php cc i tng c t vo trong cc nhm c nh th t bng cc s dng nguyn. Khi bin dch chng trnh s gi ra mn hnh theo th t cc nhm c nh s t thp n cao (0,1,2,3,.). Nhng i tng (slots) trong cng mt nhm th s tun theo quy tc FIFO. Code: #include "boost/signal.hpp" #include <iostream> int main() { struct Anh { void operator()() const { std::cout << " Thay "; } }; struct Tung { void operator()() const { std::cout << " Tung "; } }; struct Handsome { void operator()() const { std::cout << " Handsome "; } };

boost::signal<void ()> sig; sig.connect(1,Handsome()); nhm sig.connect(0,Thay()); sig.connect(0,Tung()); //Khai bo ng dn th vin //Khai bo th vin hm vo ra //Khai bo cu trc i tng th nht //Khai bo cu trc i tng th hai //Khai bo cu trc i tng th hai //To k hiu sig //Kt ni i tng vi k hiu sig c s dng nh s Kt qu in ra mn hnh: Thay Tung handsome C) Tham s i tng (Slot arguments) Signals c th truyn tham s cho mt i tng(slots) n gi. V d, ta to ra mt k hiu sig vi 2 tham s kiu s thc cho i tng(slots). Sau ta kt ni vi cc i tng tng(slots ) th khi ta truyn tham s cho sig . Chng trnh dch s t ng gi tham s ny cho cc i tng(slots) kt ni vi sig #include "boost/signal.hpp" #include <iostream> void print_sum(float x, float y) hnh kt { 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; } void print_difference(float x, float y) //Khai bo hm tnh tr v in ra mn hnh kt { qu std::cout << "The difference is " << x-y << std::endl; } void print_quotient(float x, float y) { std::cout << "The quotient is " << x/y << std::endl; } int main() { //Chng trnh chnh boost::signal<void (float, float)> sig; //To ra k hiu sig kiu void vi 2 tham s u vo dng s thc sig.connect(&print_sum); sig.connect(&print_product); sig.connect(&print_difference); sig.connect(&print_quotient); //Khai bo ng dn th vin //Khai bo th vin hm vo ra //Khai bo hm tnh nhn v in ra mn hnh kt qu //Khai bo hm tnh chia v in ra mn hnh kt qu //Kt ni k hiu sig vi cc hm php tnh c khai bo trn. Bt k hm no kt ni vi sig cng phi c 2 tham s u vo dng s thc //Gi cc slots vi tham s (5,3)

Kt qu in ra mn hnh : The sum is 8 The product is 15 The difference is 2 The quotient is 1.6666 1)Ngt i tng ( Disconnecting Slots) i tng(slots) khng tn ti v thi hn sau khi kt ni. Thng th i tng(slots) ch c s dng cho mt s kin no sau s ngt kt ni, cc lp trnh vin phi kim sot quyt nh khi no mt i tng (slots) khng cn kt ni. Ch yu ta tp trung lp boost::signals::connection. Lp kt ni duy nht i din cho cc kt ni gia mt tn hiu c th v mt i tng (slots). Phng thc connected() l kim tra xem k hiu(signals) v i tng (slots) cn c ni vi nhau khng. Phng thc disconnected() l ngt kt ni gia k hiu(signals) v i tng(slots) ti thi im lnh c gi. Mi cuc gi n phng thc connected() ca k hiu tr v mt i tng kt ni, c th c s dng xc nh nu kt ni vn cn tn ti hoc ngt kt ni k hiu(signal) v i tng(slots). #include "boost/signal.hpp" #include <iostream> int main() { struct XinChao // Khai bo cu trc i tng { 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 vn c ni vi k hiu sig(); // In ra mn hnh "Xin Chao Thay Tung !" } c.disconnect(); // Ngt i tng XinChao assert(!c.connected()); //C khng cn bt k kt ni no sig(); // Khng hin th do mt kt ni return 0; } //Khai bo ng dn th vin //Khai bo th vin hm vo ra "Xin Chao Thay Tung !" C hai lnh sig nhng ch c mt dng c in ra do mt lnh gi khi kt ni gia i tng v k hiu b ngt 2) Chn i tng( Blocking slots) Khe cm c th c tm thi "b chn", c ngha rng n s b b qua khi tn hiu c gi, nhng khng b ngt kt ni. Chc nng chn i tng c th c gii to thng qua m kha. y l mt v d v chn / m kha i tng: #include "boost/signal.hpp" #include <iostream> //Khai bo ng dn th vin //Khai bo th vin hm vo ra int main() {

struct XinChao // Khai bo cu trc i tng { void operator()() const { std::cout << "Xin Chao Thay Tung !" << std::endl; } }; boost::signal<void ()> sig; boost::signals::connection c = sig.connect(XinChao()); sig(); // Gi k hiu sig c.block(); // Chn i tng assert(c.blocked()); sig(); // Gi k hiu sig c.unblock(); // M kha i tng sig(); // // Gi k hiu sig "Xin Chao Thay Tung !" "Xin Chao Thay Tung !" C 3 lnh gi sig nhng ch c dng c in ra mn hnh do c lnh gi trong qu trnh i tng b chn 3)Kt ni tm thi (Scoped connections) L kt ni gia mt k hiu(signals) v mt i tng(slots), n s b ngt khi kt qu gi c a ra mn hnh. Chc nng ny v cng hu ch khi nu bn ch cn s dng tm thi mt kt ni no . #include "boost/signal.hpp" #include <iostream> int main() { struct XinChao

// Khai bo cu trc i tng { void operator()() const { std::cout << "Xin Chao Thay Tung !" << std::endl; //Khai bo ng dn th vin //Khai bo th vin hm vo ra } }; boost::signal<void ()> sig; { boost::signals::scoped_connection c = sig.connect(XinChao()); sig(); // Gi i tng } sig(); // Gi i tng return 0; } "Xin Chao Thay Tung !" Nhn xt: C 2 lnh gi sig() nhng ch c mt dng c in ra do sau khi gi xong sig() th nht kt ni lp tc b mt do vy khi gi sig() th hai s khng hin trn mn output 4) Ngt i tng tng ng (Disconnecting equivalent slots) Ta c th ngt tng ng cc i tng bng cch s dng phng thc disconnect, min l cc loi ca i tng chc nng c cng kiu truy cp l operator #include "boost/signal.hpp" #include <iostream> void print_sum(float x, float y) //Khai bo hm tnh tng v in ra mn hnh kt 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 kt qu { std::cout << "The product is " << x*y << std::endl; } void print_difference(float x, float y) //Khai bo ng dn th vin //Khai bo th vin hm vo ra //Khai bo hm tnh tr v in ra mn hnh kt qu Bi tp ln k thut lp trnh 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 kt qu { std::cout << "The quotient is " << x/y << std::endl; } int main() { boost::signal<void (float, float)> sig; sig.connect(&print_sum); //Kt ni k hiu sig vi cc hm php tnh sig.connect(&print_product); c khai bo trn. Bt k hm no kt ni vi sig.connect(&print_difference); sig cng phi c 2 tham s u vo dng s sig.connect(&print_quotient); thc sig(5, 3); //Gi cc slots vi tham s (5,3)

sig.disconnect(&print_sum); sig(5, 3); return 0; } //Chng trnh chnh //To ra k hiu sig kiu void vi 2 tham s u vo dng s thc // Ngt kt ni tng ng i tng print_sum //Gi cc slots vi tham s (5,3) 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 Nhn xt: Do ta ngt kt ni ca i tng print_sum nn kt qu in ra sau lnh gi i tng sig(5,3) th hai ch cn 3 gi tr nh trn. 5)iu kin xy ra ngt kt ni: _iu kin xy ra ngt kt ni c th l mt trong s ci trng hp sau: + B ngt trc tip bi phng thc disconnect(), hoc gin tip do phng thc kt ni tm thi (Scoped connections). +Mt i tng theo di rng buc slots b hy. +K hiu b hy _Nhng s kin ny c th xy ra bt c lc no m khng lm gin on chui gi cc k hiu. Nu mt kt ni k hiu (signal) / i tng(slots) b ngt bt c lc no trong qu trnh gi, qu trnh gi vn s tip tc v khng gi nhng i tng m kt ni b ngt.

6)V d1 c Vn Bn Gm 2 phn: +c di dng text +c di dng hex #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;

} 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)); } m_document.disconnect(m_connection); virtual void refresh(bool bExtended) const = 0; m_document; 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:"; 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; } 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

V d 2: Yu cu: qun l 1 lp x l tin nhn lm tng s kin n 1 lp hc kinh doanh, qu trnh ca tin nhn v gi ti cho ngi dng . Yu cu l bit tin nhn gi n th no( ngi gi, th t) Class A lm tng nhiu s kin Class B tham gia vao cc s kin ( nhiu lp hc c th c ng k) ClassA pht ra hai tn hiu; SigA gi (v chp nhn) khng c tham s, SigB gi mt int . ClassB c hai chc nng m s xut ra cout mi khi hm c gi . Trong v d ny l mt v d ca ClassA ( a ) v hai ca ClassB ( b v b2 ). main c s dng kt ni v bn tn hiu. N c gi tr lu rng ClassA v ClassB khng lin quan nhau( khng bin dch thigian rng buc) #include <boost/signal.hpp> #include <boost/bind.hpp> #include <iostream> using namespace boost; using namespace std; struct ClassA { signal<void ()> SigA; signal<void (int)> SigB; }; struct ClassB {

void PrintFoo() { cout << "Foo" << endl; } void PrintInt(int i) { cout << "Bar: " << i << endl; } }; int main() { ClassA a; ClassB b, b2; a.SigA.connect(bind(&ClassB::PrintFoo, &b)); a.SigB.connect(bind(&ClassB::PrintInt, &b, _1)); a.SigB.connect(bind(&ClassB::PrintInt, &b2, _1)); a.SigA(); a.SigB(4); } The output: Foo Bar: 4 Bar: 4

You might also like