X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/212f9ae5dc8899bab8b23ed13d81c28c510db3c3..d46988670a776e174147fc0cce35652383177785:/Server/include/plaqui/server/runnable.h?ds=sidebyside diff --git a/Server/include/plaqui/server/runnable.h b/Server/include/plaqui/server/runnable.h index 258cd2d..51480a0 100644 --- a/Server/include/plaqui/server/runnable.h +++ b/Server/include/plaqui/server/runnable.h @@ -35,7 +35,74 @@ namespace PlaQui { namespace Server { - /// ealizauna tarea (generalmente en un thread). + /** + * Objeto cuya función principal es realizar una tarea puntual. + * + * Esta el la clase base para todos objetos que realizan una tarea, ya sea + * en un hilo (thread) propio o no. Al tener esta flexibilidad hay + * dos formas típicas de usarlo cuyo punto en común es implementar una + * subclase (ya que esta clase es abstracta) y sobreescribir el método + * privado real_run(). Una vez hecho esto hay dos opciones más comunes + * según se lo corra en un thread o no: + * - Para correrlo en el hilo principal (esperando que termine de + * ejecutarse) generalmente basta con crear el objeto de forma estática y + * llamar a su método run(): + * \code + * #include "runnable.h" + * #include + * + * // Mi objeto que realiza la tarea. + * class MiRunnable: public Runnable { + * void real_run(void) { std::cout << "Corriendo." << std::endl; } + * } + * + * // Programa principal. + * int main(void) { + * MiRunnable runner; + * runner.run(false); // Corre en el hilo principal + * return 0; + * } + * \endcode + * - Para correrlo en el hilo propio el proceso es un poco más complejo, en + * especial si se necesita saber cuando finalizó. Si esto no fuera + * necesario, basta con crear el objeto dinámicamente y correr su método + * run(). El objeto se libera automáticamente cuando termina su tarea. + * Si es necesario saber cuando termina, se puede usar la señal + * signal_finished(). El caso típico sería: + * \code + * #include "runnable.h" + * #include + * + * // Mi objeto que realiza la tarea. + * class MiRunnable: public Runnable { + * void real_run(void) { std::cout << "Corriendo." << std::endl; } + * } + * + * // Puntero al objeto que realiza la tarea. + * MiRunnable* runner; + * + * // Atiende la señal que indica que el objeto terminó su tarea. + * void on_finished(void) { + * runner = 0; + * } + * + * // Programa principal. + * int main(void) { + * runner = new MiRunnable(); + * runner->run(); // Corre en un hilo propio + * // Espera a que termine la tarea. + * while (runner) { + * sleep(1); + * } + * // No necesito liberar su memoria, se libera automáticamente. + * return 0; + * } + * \endcode + * + * Nótese que al correr la tarea en un hilo propio no se pueden capturar + * errores con un bloque try;catch. Para reportar errores se provee + * de la señal signal_error(). + */ class Runnable { ///////////////////////////////////////////////////////////////////// @@ -46,11 +113,26 @@ namespace Server { /// Error. typedef unsigned Error; + ///////////////////////////////////////////////////////////////////// + /// \name Señales. + //@{ + + public: + /// Tipo de señal para indicar que se finalizó la tarea. typedef SigC::Signal0 SignalFinished; /// Tipo de señal para indicar que hubo un error. - typedef SigC::Signal2 SignalError; + typedef SigC::Signal2 + SignalError; + + /// Obtiene la señal que avisa cuando la tarea es finalizada. + SignalFinished& signal_finished(void); + + /// Obtiene la señal que avisa que hubo un error. + SignalError& signal_error(void); + + //@} ///////////////////////////////////////////////////////////////////// // Atributos. @@ -103,7 +185,7 @@ namespace Server { /** * Realiza la terea. */ - virtual void real_run(void) = 0; + virtual void real_run(void) throw() = 0; public: @@ -133,15 +215,6 @@ namespace Server { */ virtual void finish(void); - /** - * Obtiene la señal que avisa cuando la tarea es finalizada. - */ - SignalFinished& signal_finished(void); - - /** - * Obtiene la señal que avisa que hubo un error. - */ - SignalError& signal_error(void); };