From 6f70c17ffefd6150b68ac0f64a8116e730437408 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sun, 23 Nov 2003 18:14:11 +0000 Subject: [PATCH] Se termina de poner prolijo Runnable: - Se completa la documentacion. - Se arreglan las otras clases. --- Server/include/plaqui/server/controlclient.h | 2 +- Server/include/plaqui/server/controlserver.h | 2 +- Server/include/plaqui/server/plant.h | 2 +- Server/include/plaqui/server/receiver.h | 2 +- Server/include/plaqui/server/runnable.h | 98 +++++++++++++++++--- Server/include/plaqui/server/server.h | 4 +- Server/include/plaqui/server/tcpserver.h | 2 +- Server/include/plaqui/server/transmitter.h | 2 +- Server/src/controlclient.cpp | 2 +- Server/src/controlserver.cpp | 2 +- Server/src/plant.cpp | 2 +- Server/src/receiver.cpp | 2 +- Server/src/runnable.cpp | 9 +- Server/src/tcpserver.cpp | 3 +- Server/src/transmitter.cpp | 3 +- 15 files changed, 103 insertions(+), 34 deletions(-) diff --git a/Server/include/plaqui/server/controlclient.h b/Server/include/plaqui/server/controlclient.h index 254f815..54b10be 100644 --- a/Server/include/plaqui/server/controlclient.h +++ b/Server/include/plaqui/server/controlclient.h @@ -79,7 +79,7 @@ namespace Server { /** * Realiza la conexión al servidor. */ - virtual void real_run(void); + virtual void real_run(void) throw(); public: diff --git a/Server/include/plaqui/server/controlserver.h b/Server/include/plaqui/server/controlserver.h index a5cb0fe..c954cb1 100644 --- a/Server/include/plaqui/server/controlserver.h +++ b/Server/include/plaqui/server/controlserver.h @@ -65,7 +65,7 @@ namespace Server { /** * Atiende la conexión. */ - virtual void real_run(void); + virtual void real_run(void) throw(); public: diff --git a/Server/include/plaqui/server/plant.h b/Server/include/plaqui/server/plant.h index 753899b..9a54328 100644 --- a/Server/include/plaqui/server/plant.h +++ b/Server/include/plaqui/server/plant.h @@ -76,7 +76,7 @@ namespace Server { /** * Corre la planta (la monitorea o la simula). */ - virtual void real_run(void); + virtual void real_run(void) throw(); public: diff --git a/Server/include/plaqui/server/receiver.h b/Server/include/plaqui/server/receiver.h index c33fd28..ddf4fd3 100644 --- a/Server/include/plaqui/server/receiver.h +++ b/Server/include/plaqui/server/receiver.h @@ -75,7 +75,7 @@ namespace Server { /** * Recibe la transmisión. */ - virtual void real_run(void); + virtual void real_run(void) throw(); public: diff --git a/Server/include/plaqui/server/runnable.h b/Server/include/plaqui/server/runnable.h index 258cd2d..810f5db 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,12 +113,6 @@ namespace Server { /// Error. typedef unsigned Error; - /// 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; - ///////////////////////////////////////////////////////////////////// // Atributos. @@ -103,7 +164,7 @@ namespace Server { /** * Realiza la terea. */ - virtual void real_run(void) = 0; + virtual void real_run(void) throw() = 0; public: @@ -133,16 +194,25 @@ namespace Server { */ virtual void finish(void); - /** - * Obtiene la señal que avisa cuando la tarea es finalizada. - */ + ///////////////////////////////////////////////////////////////// + /// \name Señales. + //@{ + + /// 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; + + /// 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. - */ + /// Obtiene la señal que avisa que hubo un error. SignalError& signal_error(void); + //@} + }; } diff --git a/Server/include/plaqui/server/server.h b/Server/include/plaqui/server/server.h index f8757e7..0e5fe2b 100644 --- a/Server/include/plaqui/server/server.h +++ b/Server/include/plaqui/server/server.h @@ -140,8 +140,8 @@ namespace Server { /** * Constructor. * - * \param filename Nombre del archivo con la planta a cargar. - * \param port Puerto en el cual escuchar. + * \param plant_filename Nombre del archivo con la planta a cargar. + * \param port Puerto en el cual escuchar. */ Server(const std::string& plant_filename, const Connection::Port& port = 7522) throw(sockerr); diff --git a/Server/include/plaqui/server/tcpserver.h b/Server/include/plaqui/server/tcpserver.h index d94918e..2e3fb6a 100644 --- a/Server/include/plaqui/server/tcpserver.h +++ b/Server/include/plaqui/server/tcpserver.h @@ -96,7 +96,7 @@ namespace Server { /** * Entra en el loop para atender conexiones. */ - virtual void real_run(void); + virtual void real_run(void) throw(); protected: diff --git a/Server/include/plaqui/server/transmitter.h b/Server/include/plaqui/server/transmitter.h index 624ff3b..16f751d 100644 --- a/Server/include/plaqui/server/transmitter.h +++ b/Server/include/plaqui/server/transmitter.h @@ -46,7 +46,7 @@ namespace Server { /** * Comienza a transmitir. */ - virtual void real_run(void); + virtual void real_run(void) throw(); public: diff --git a/Server/src/controlclient.cpp b/Server/src/controlclient.cpp index 653fcae..b8dec74 100644 --- a/Server/src/controlclient.cpp +++ b/Server/src/controlclient.cpp @@ -67,7 +67,7 @@ ControlClient::ControlClient(const string& _host, receiver = new Receiver(7528, host); } -void ControlClient::real_run(void) { +void ControlClient::real_run(void) throw() { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" << ": real_run." << endl; diff --git a/Server/src/controlserver.cpp b/Server/src/controlserver.cpp index 41d5419..2fd7652 100644 --- a/Server/src/controlserver.cpp +++ b/Server/src/controlserver.cpp @@ -57,7 +57,7 @@ ControlServer::ControlServer(const sockbuf::sockdesc& sd): #endif // DEBUG } -void ControlServer::real_run(void) { +void ControlServer::real_run(void) throw() { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" << ": real_run()" << endl; diff --git a/Server/src/plant.cpp b/Server/src/plant.cpp index 0e70a1f..970fbab 100644 --- a/Server/src/plant.cpp +++ b/Server/src/plant.cpp @@ -80,7 +80,7 @@ Plant::Plant(const string& filename): simulator(filename), filename(filename) { */ } -void Plant::real_run(void) { +void Plant::real_run(void) throw() { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" << ": real_run." << endl; diff --git a/Server/src/receiver.cpp b/Server/src/receiver.cpp index 6e6c503..ad42cfe 100644 --- a/Server/src/receiver.cpp +++ b/Server/src/receiver.cpp @@ -60,7 +60,7 @@ Receiver::Receiver(const Connection::Port& port, const string& host) } // XXX EL XML DEBE EMPEZAR Y FINALIZAR EN UNA LINEA SEPARADA. -void Receiver::real_run(void) { +void Receiver::real_run(void) throw() { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" << ": real_run." << endl; diff --git a/Server/src/runnable.cpp b/Server/src/runnable.cpp index 7079143..9587fd9 100644 --- a/Server/src/runnable.cpp +++ b/Server/src/runnable.cpp @@ -41,15 +41,14 @@ namespace Server { Runnable::~Runnable(void) { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" - << ": destructor(this = " << this << ")" - << endl; + << ": destructor(this = " << this << ")." << endl; #endif // DEBUG } Runnable::Runnable(void): _thread(NULL), _stop(false) { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" - << ": constructor." << endl; + << ": constructor(this = " << this << ")." << endl; #endif // DEBUG } @@ -58,7 +57,9 @@ void Runnable::static_run(Runnable* runner) { cerr << __FILE__ << "(" << __LINE__ << ")" << ": static_run(runner = " << runner << ")" << endl; #endif // DEBUG + // Corre tarea. runner->real_run(); + // Manda señal de tarea finalizada runner->_finished(); delete runner; } @@ -74,7 +75,7 @@ void Runnable::run(bool detach) { // finalizar, pasandole el puntero al objeto. _thread = Glib::Thread::create( SigC::bind(SigC::slot(&Runnable::static_run), this), - false);//true); + false); // Si no corremos la tarea normalmente. } else { real_run(); diff --git a/Server/src/tcpserver.cpp b/Server/src/tcpserver.cpp index 8272e57..ab245b5 100644 --- a/Server/src/tcpserver.cpp +++ b/Server/src/tcpserver.cpp @@ -115,8 +115,7 @@ void TCPServer::on_connection_finished(Connection* connection) { #endif // DEBUG } -/// \todo TODO: ver tema de timeout o como salir de un accept(). -void TCPServer::real_run(void) { +void TCPServer::real_run(void) throw() { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" << ": real_run()" << endl; diff --git a/Server/src/transmitter.cpp b/Server/src/transmitter.cpp index 4348da6..9d0e24d 100644 --- a/Server/src/transmitter.cpp +++ b/Server/src/transmitter.cpp @@ -64,8 +64,7 @@ Transmitter::Transmitter(const string& _host, const Connection::Port& _port) #endif // DEBUG } -/// \todo debría dar una excepción (?) -void Transmitter::real_run(void) { +void Transmitter::real_run(void) throw() { #ifdef DEBUG cerr << __FILE__ << "(" << __LINE__ << ")" << ": real_run()." << endl; -- 2.43.0