#define PLAQUI_RUNNABLE_H
#include <glibmm/thread.h>
+#include <sigc++/signal.h>
-namespace Plaqui {
+namespace PlaQui {
+
+namespace Server {
/// ealizauna tarea (generalmente en un thread).
class Runnable {
+ // Tipos.
+
+ public:
+
+ /// Tipo de señal para indicar que se finalizó la tarea.
+ typedef SigC::Signal0<void> SignalFinished;
+
+ // Atributos.
+
private:
- // Thread en el cual correr la tarea.
+
+ /// Thread en el cual correr la tarea.
Glib::Thread* thread;
+ /// Señal que indica que se finalizó la tarea.
+ SignalFinished finished;
+
+ protected:
+
+ /**
+ * Indica si se debe frinalizar la tarea.
+ *
+ * \todo Poner como privado y poner get() set() con locks.
+ */
+ bool stop;
+
+ /**
+ * Exclusión mutua.
+ * Recurso usado para recibir la exclusividad sobre un recurso.
+ */
+ Glib::Mutex mutex;
+
+ // Métodos.
+
+ private:
+
+ /**
+ * Corre la tarea controlando cuando termina.
+ *
+ * \param runner Objeto con la tarea a realizar.
+ */
+ static void static_run(Runnable* runner);
+
protected:
/// Realiza la terea.
/**
* Destructor.
*/
- virtual ~Runnable(void) {}
+ virtual ~Runnable(void);
/**
* Constructor.
Runnable(void);
/**
- * Comienza la tares.
+ * Comienza la tarea.
*
* \param detach Si es true se corre en un thread propio. Si no no
* retorna hasta que finaliza.
*/
virtual void run(bool detach = true);
+ /**
+ * Finaliza la tarea.
+ *
+ * \param attach Si es true, la función no retorna hasta que no
+ * finalice la tearea (no recomendable).
+ *
+ * \note Para saber cuando la tarea fue finalizada puede utilizar
+ * la señal signal_finished().
+ */
+ virtual void finish(bool attach = false);
+
+ /**
+ * Obtiene la señal que avisa cuando la tarea es finalizada.
+ *
+ * \see finish().
+ */
+ SignalFinished& signal_finished(void);
+
};
}
+}
+
#endif // PLAQUI_RUNNABLE_H