2010-01-15 30 views
10

Estoy llamando a emit signal1() desde un subproceso no Qt. Por subproceso no Qt no me refiero al lazo de evento GUI y no a ningún método QThread run() ni a ningún evento propio QThread.emitir la señal Qt desde el subproceso Qt no Qt o fuera Qt evento principal de bucle con en 4.5

Es simplemente un pthread (pthread_create()) que llama a un método de QObject que emite señales.

ejemplo:

MyQbject: public QObject 
{ 
... 
void emitBunchOfSignals() 
{ 
emit signal1(); 
emit signal2(); 
... 
} 
... 
} 

el método "run" de mi pthread que tiene un puntero a una instancia MiObjeto (instancia que se crea dentro del contexto del subproceso Qt GUI principal no la pthread) llama a los métodos emitBunchOfSignals().

Antes Qt 4.5 que era desagradable. Ahora, ¿Qt 4.5 maneja esto? ¿Llama al qApp->PostEvent() o algo así para que la señal se emita dentro del subproceso de GUI de Qt (y, por lo tanto, de la ranura también)?

gracias

+0

Cuando llame a connect, puede establecer explícitamente el tipo de conexión en cola. –

+0

En el tiempo que tardó en escribir esta pregunta, podría haber abierto el código y buscarlo usted mismo. – shoosh

+0

No parece sencillo ya que solía colgarse con Qt 3.xx. Estoy familiarizado con la opción de conexión (conexión en cola de conexión directa, etc.) pero pensé que funcionaba solo entre QTreads o entre un QThread y el bucle de evento principal. Por qué solía colgarse con Qt 3.xx al menos no era fácil de entender al mirar el código. Estoy loco ? –

Respuesta

8

Lo que hay que asegurarse es que se utiliza una conexión en cola a una de las discusiones, como Qt no puede autmatically detectar qué objeto que pertenecen a cada hilo ("afinidad hilo" es el término utilizado en el documentación). Esto se hace cuando se conecta:

connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection); 

que dará lugar a la señal que se ejerce sobre el bucle de eventos del destino, y la ranura de ser llamado cuando su hilo está en marcha (es decir, el bucle de eventos).

+3

muchas gracias. Para asegurarse de que entiendo lo que quiere decir: Dado que mi QObject emisor no pertenece a un QThread ni al hilo principal de GUI de Qt (pertenece realmente a mi hilo de Corba), Qt no puede detectar la afinidad del hilo. Por lo tanto, tengo que forzar la conexión a QueuedConnection ya que AutomaticConnection no funcionará en este caso específico. Sin embargo, cuando el QObject emisor pertenece a un QThread, Qt puede detectar la afinidad de la secuencia y una conexión automática hará la publicación necesaria en el bucle de eventos de la secuencia QObject del receptor. –