Comment configurer/enregistrer une fonction de rappel, en C++, pour appeler une fonction lorsqu'il y a des données à lire dans une file d'attente?Comment ajouter/concevoir la fonction de rappel
Edit 1:
En utilisant la réponse de Neil pour une réponse complète (dans le fichier d'en-tête):
#include <vector.h>
class QueueListener {
public:
virtual void DataReady(class MyQueue *q) = 0;
virtual ~QueueListener() {}
};
class MyQueue {
public:
void Add (int x) {
theQueue.push_back(x);
for (int i = 0; i < theCallBacks.size(); i++) {
theCallBacks[i]->DataReady(this);
}
}
void Register (QueueListener *ql) {
theCallBacks.push_back(ql);
}
private:
vector <QueueListener *> theCallBacks;
vector <int> theQueue;
};
class MyListener : public QueueListener {
public:
virtual ~MyListener() {
printf("MyListener destructor!");
}
MyListener(MyQueue *q);
virtual void DataReady(class MyQueue *p);
};
Et l'enregistrement:
#include "File1.h"
MyListener::MyListener(MyQueue *q)
{
q->Register(this);
}
void MyListener::DataReady(class MyQueue *p)
{
Sleep(500);
}
Ensuite, les appels:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MyQueue *q = new MyQueue();
MyListener ml(q);
q->Add(1);
}
Cela semble un peu java-y ou au moins C++ 98. Je préfère les foncteurs et me lie. –
Merci Neil - Je l'ai eu à travailler. J'ai dû changer le ceci à ceci dans la déclaration de DataReady sous MyQueue cependant. –
@Caspin Première fois que j'ai été accusé d'écrire du code Java. Et pourquoi n'avez-vous pas produit une solution utilisant des foncteurs et liez-vous? –