2011-04-08 14 views
5

en Windows C++ puedo crear un identificador de eventoEquivalente Boost para Windows Eventos

asa H = CreateEvent (...)

puedo fijar entonces y restablecer ese evento

SetEvent (. ..) y ResetEvent (...)

Finalmente, puede OpenEvents utilizando el comando OpenEvent (...)

¿hay un equivelent impulso para eventos?

+0

¿Necesita el aspecto IPC multiproceso de 'OpenEvent', o solo necesita comunicación dentro del proceso? – Thanatos

+0

Solo dentro del proceso, sin IPC. – rossb83

+0

Aunque no es estrictamente un duplicado, esta pregunta http://stackoverflow.com/questions/1677070/cross-platform-equivalent-to-windows-events proporciona la respuesta adecuada a su pregunta. – Cray

Respuesta

6

Creo que necesita utilizar boost::mutex, boost::unique_lock, boost::condition_variable y posiblemente bool para imitar Eventos.

En realidad podría necesitar un tipo de WaitForSingleObject para esperar un evento. Podría ser así:

void wait_for_user_input() 
{ 
    boost::unique_lock<boost::mutex> lock(mut); 
    while(!data_ready) 
    { 
     cond.wait(lock); 
    } 
    process_user_input(); // it might be not necessary to hold mutex locked here!!! 
          // if so just add curly braces like this: 
          // void wait_for_user_input() 
          // { 
          // { 
          //  boost::unique_lock<boost::mutex> lock(mut); 
          //  while(!data_ready) { cond.wait(lock); } 
          // } 
          // process_user_input(); 
          // } 



} 
-1

Un impulso lock (mutex) haría más o menos lo mismo. Puedes esperar en esos.

+0

No necesariamente. Me gustaría ejecutar un ciclo while en el hilo A continuamente hasta que el hilo B desencadene un evento. – rossb83

+0

así que use "timed_lock (mutex, timeout)" dentro de su ciclo –

+0

No quiero que entren timings. Simplemente quiero un evento desencadenante. Cuando el usuario hace clic en un botón que causa un evento. – rossb83

-1

Lo que queremos es named_condition variable del boost interprocess library. La diferencia principal de los eventos de Windows es que debe usarlos junto con un named_mutex.

Nota, puede utilizar estas primitivas de interproceso de impulso en un solo proceso. Supongo que los necesita porque está utilizando OpenEvent (lo que implica compartir el objeto mediante el uso de un nombre). Si puede evitar el uso de un nombre, puede usar las variantes no nombradas de la biblioteca boost thread.

+3

IPC no es obligatorio según el autor. Además de 'name mutexes' si una aplicación falla, no se eliminan automáticamente. Y como resultado, después de que uno agrega mutexes nombrados, él o ella también tiene que manejar de alguna manera esta situación. En mi humilde opinión solo crea complejidad innecesaria. –

4

La biblioteca de rosca Boost Signals2 puede ser útil para usted. La biblioteca original de Signals no era segura para subprocesos, pero implementó un marco de señales/ranuras que no está muy lejos de las ideas de los eventos. Dado que Signals2 es seguro para la realización de hilos, debería poder utilizarlo para pasar eventos entre hilos.