aumentar el problema de la fecha límite_temporizador

Aquí sigue la implementación de una clase de prueba que envuelve un hilo con un temporizador. Lo raro es que si el plazo lo pongo en 500 milisegundos funciona pero si lo pongo en 1000 milisegundos no. ¿Qué estoy haciendo mal?

#include "TestTimer.hpp"
#include "../SysMLmodel/Package1/Package1.hpp"

TestTimer::TestTimer(){
    thread = boost::thread(boost::bind(&TestTimer::classifierBehavior,this));
    timer = new      boost::asio::deadline_timer(service,boost::posix_time::milliseconds(1000));
    timer->async_wait(boost::bind(&TestTimer::timerBehavior, this));


};

TestTimer::~TestTimer(){
}

void TestTimer::classifierBehavior(){
 service.run();
};


void TestTimer::timerBehavior(){
std::cout<<"timerBehavior\r";
timer->expires_at(timer->expires_at() + boost::posix_time::milliseconds(1000));
timer->async_wait(boost::bind(&TestTimer::timerBehavior,this));
}

ACTUALIZACIÓN 1 Me di cuenta de que el programa se atasca (o al menos la salida estándar en la consola durante muchos segundos, unos 30), luego se imprimen muchas cadenas de "timerBehavior" juntas como si hubieran estado en cola en algún lugar.

preguntado el 28 de julio de 12 a las 12:07

Debe asegurarse de que su servicio no se esté quedando sin trabajo. No hay nada que impida que el subproceso se inicie primero y ejecute service.run() una vez. Luego, después de que el subproceso se quedó sin trabajo, se ejecuta la segunda línea de TestTimer c'tor. -

@Torsten: actualicé mi pregunta con más detalles. Estoy usando Eclipse con gcc -

1 Respuestas

Su programa puede tener varios problemas. Por lo que ha mostrado, es difícil decir si el programa se detiene antes de que el temporizador tenga la oportunidad de activarse. Y, no vacíe su salida, use std::endl, si desea vaciar la salida después de una nueva línea. En tercer lugar, si su subproceso va a ejecutar la función io_service.run(), es posible que el subproceso encuentre una cola de io vacía y run() regrese inmediatamente. Para evitar eso, hay una clase de trabajo que lo evitará. Aquí está mi ejemplo, de su código, que podría funcionar como se esperaba:

#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <iostream>

class TestTimer
{
public:
    TestTimer()
        : service()
        , work( service )
        , thread( boost::bind( &TestTimer::classifierBehavior,this ) )
        , timer( service,boost::posix_time::milliseconds( 1000 ) )
    {
        timer.async_wait( boost::bind( &TestTimer::timerBehavior, this ) );
    }

    ~TestTimer()
    {
        thread.join();
    }
private:
    void classifierBehavior()
    {
        service.run();
    }


    void timerBehavior() {
        std::cout << "timerBehavior" << std::endl;
        timer.expires_at( timer.expires_at() + boost::posix_time::milliseconds( 1000 ) );
        timer.async_wait( boost::bind( &TestTimer::timerBehavior,this ) );
    }

    boost::asio::io_service         service;
    boost::asio::io_service::work   work;
    boost::thread                   thread;
    boost::asio::deadline_timer     timer;
};

int main()
{
    TestTimer test;
}

Respondido 28 Jul 12, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.