- Back to Home »
- Programming techniques »
- C/C++ Signal-slot
Wednesday, May 20, 2015
Signal-slot là một cơ chế để thực hiện việc một object này thông báo một sự kiện đến một object khác theo cơ chế tương tự như interrupt.
Các đối tượng muốn signal-slot được với nhau cần có một đăng ký kết nối trước, một object có thể cùng lúc có nhiều kết nối đến nhiều object khác, lưu ý định dạng dữ liệu giữa bên phát và nhận phải giống nhau.
Khai báo class signal:
class Button:public sigslot::has_signals<Button>
{
//attributes
//methods
public __signals:
sigslot::signal<char*> touchEvent;
};
Khai báo class slot:
class View:public sigslot::has_slots<> { //attributes //methods public __slots: void onUpdate(
char *msg
){ cout << "recvmsg: " << msg <<endl; } };
Khai báo class vừa phát vừa nhận
class TransRecv:public sigslot::has_signals<TransRecv> , sigslot::has_slots<>
{
//attributes
//methods
public __signals: //phat signal cho object A
sigslot::signal<char *> touchPoint;
public __slots: //nhan signal tu object B
void onUpdate(float fdata, int idata);
};
Duới đây là một ví dụ:
sigslot.h (định nghĩa cơ chế signal-slot của QT Framework)
main.cpp
#include <iostream>
#include "sigslot.h"
using namespace std;
class Button:public sigslot::has_signals<Button>
{
public:
Button(){ };
virtual ~Button(){ };
void onClick(){
touchEvent.emit((char*)"Hello, I am button");
}
public __signals:
sigslot::signal<char*> touchEvent;
};
class View:public sigslot::has_slots<>
{
public:
View(){ };
virtual ~View(){ };
public __slots:
void onUpdate(char *msg){
cout << "recvmsg: " << msg <<endl;
}
};
int main(int argc, char **argv){
Button btn;
View view;
btn.touchEvent.connect(&view, &View::onUpdate);
btn.onClick();
return 1;
}
Compile & Execute:
$ g++ sigslot.h main.cpp
$ ./a.out
recvmsg: Hello, I am button