Fixed Queue to allow for removal of callbacks.

master
Hannes Matuschek 12 years ago
parent 8210ccf6f8
commit a9174d2daf

@ -188,8 +188,6 @@ WaterFallView::paintEvent(QPaintEvent *evt)
QRect exposedRect = painter.matrix().inverted() QRect exposedRect = painter.matrix().inverted()
.mapRect(evt->rect()) .mapRect(evt->rect())
.adjusted(-1, -1, 1, 1); .adjusted(-1, -1, 1, 1);
qDebug() << "Draw " << QRect(0,0,_N,_M) << " at "
<< painter.matrix().mapRect(QRect(0,0,_N,_M));
// the adjust is to account for half pixels along edges // the adjust is to account for half pixels along edges
painter.drawPixmap(exposedRect, _waterfall, exposedRect); painter.drawPixmap(exposedRect, _waterfall, exposedRect);
//painter.drawPixmap(0,0, _waterfall); //painter.drawPixmap(0,0, _waterfall);

@ -5,6 +5,7 @@
#include <map> #include <map>
#include "buffer.hh" #include "buffer.hh"
#include <pthread.h> #include <pthread.h>
#include <iostream>
namespace sdr { namespace sdr {
@ -17,6 +18,7 @@ class DelegateInterface {
public: public:
/** Call back interface. */ /** Call back interface. */
virtual void operator() () = 0; virtual void operator() () = 0;
virtual void *instance() = 0;
}; };
/** Specific delegate to a method of an object . */ /** Specific delegate to a method of an object . */
@ -30,6 +32,8 @@ public:
virtual ~Delegate() {} virtual ~Delegate() {}
/** Callback, simply calls the method of the instance given to the constructor. */ /** Callback, simply calls the method of the instance given to the constructor. */
virtual void operator() () { (_instance->*_function)(); } virtual void operator() () { (_instance->*_function)(); }
virtual void *instance() { return _instance; }
protected: protected:
/** The instance. */ /** The instance. */
T *_instance; T *_instance;
@ -122,18 +126,53 @@ public:
_idle.push_back(new Delegate<T>(instance, function)); _idle.push_back(new Delegate<T>(instance, function));
} }
template <class T>
void remIdle(T *instance) {
std::list<DelegateInterface *>::iterator item = _idle.begin();
while (item != _idle.end()) {
if ( (*item)->instance() == ((void *)instance)) {
item = _idle.erase(item);
} else {
item++;
}
}
}
/** Adds a callback to the start event. The method gets called once the queue loop is started. */ /** Adds a callback to the start event. The method gets called once the queue loop is started. */
template <class T> template <class T>
void addStart(T *instance, void (T::*function)(void)) { void addStart(T *instance, void (T::*function)(void)) {
_onStart.push_back(new Delegate<T>(instance, function)); _onStart.push_back(new Delegate<T>(instance, function));
} }
template <class T>
void remStart(T *instance) {
std::list<DelegateInterface *>::iterator item = _onStart.begin();
while (item != _onStart.end()) {
if ( (*item)->instance() == ((void *)instance)) {
item = _onStart.erase(item);
} else {
item++;
}
}
}
/** Adds a callback to the stop event. The method gets called once the queue loop is stopped. */ /** Adds a callback to the stop event. The method gets called once the queue loop is stopped. */
template <class T> template <class T>
void addStop(T *instance, void (T::*function)(void)) { void addStop(T *instance, void (T::*function)(void)) {
_onStop.push_back(new Delegate<T>(instance, function)); _onStop.push_back(new Delegate<T>(instance, function));
} }
template <class T>
void remStop(T *instance) {
std::list<DelegateInterface *>::iterator item = _onStop.begin();
while (item != _onStop.end()) {
if ( (*item)->instance() == ((void *)instance)) {
item = _onStop.erase(item);
} else {
item++;
}
}
}
protected: protected:
/** The actual queue loop. */ /** The actual queue loop. */

Loading…
Cancel
Save