2011-02-19 15 views

Respuesta

15

Para un ciclo de eventos use boost :: asio :: io_service. Puede publicar tareas dentro de este objeto y hacer que otro hilo las ejecute, de manera segura para hilos:

struct MyClass 
{ 
    boost::io_service service; 
    void doSomethingOp() const { ... } 

    void doSomething() 
    { 
     service.post(boost::bind(&MyClass::doSomethingOp, this)); 
    } 

    void loop() 
    { 
      service.run(); // processes the tasks 
    } 
}; 

boost::signal<void()> mySignal; 

MyClass myClass; 
mySignal.connect(boost::bind(&MyClass::doSomething, boost::ref(myClass))); 

// launches a thread and executes myClass.loop() there 
boost::thread t(boost::bind(&MyClass::loop(), boost::ref(myClass))); 

// calls myClass.doSomething() in this thread, but loop() executes it in the other 
mySignal(); 
+2

¡THX para esta muestra tan útil! Como boost :: signal está en desuso, tengo que usar boost :: signals2 :: signal <>. – synapse

2

No directamente, porque el impulso no proporciona un bucle de evento.

Para tener una señal manejada en otro hilo, ese otro hilo necesita verificar la cola de manejadores que debe ejecutar y ejecutarlos (lo que generalmente significa algún tipo de bucle de evento). Boost no proporciona uno, por lo que deberá obtenerlo de otra parte o escribirlo.

Si tiene un bucle de evento, que no proporciona señales (o implementa una solución simple con colas) debería poder (ab) usar boost.signals2 (no boost.signals, porque esa versión no es seguro para subprocesos) anulando el operator+= para envolver cada controlador en algo, que lo pondrá en cola para su ejecución en el otro subproceso. Incluso podría implementarlo para señales con valores de retorno (que no es compatible con Qt, pero es compatible con boost), pero deberá tener cuidado para evitar el bloqueo muerto.

Cuestiones relacionadas