2009-08-12 5 views

Respuesta

41

Depende. Desde documentation:

Cuando se emite una señal, las ranuras conectadas a ella generalmente se ejecutan inmediatamente, al igual que una llamada de función normal. Cuando esto sucede, el mecanismo de señales y ranuras es totalmente independiente de cualquier bucle de eventos GUI. La ejecución del código que sigue a la declaración emit ocurrirá una vez que todos los espacios hayan retornado. La situación es ligeramente diferente cuando se usa queued connections; en tal caso, el código que sigue a la palabra clave emitir continuará de inmediato, y las ranuras se ejecutarán más adelante.

Por lo tanto, en casos normales, será síncrono y de bloqueo, y con conexiones en cola será asincrónico y no bloqueante.

+10

También tenga en cuenta que, de forma predeterminada, las conexiones entre objetos en el mismo subproceso son directas (sincrónicas) y las conexiones entre objetos en subprocesos diferentes se ponen en cola. Si lo piensas, es bastante lógico. – quark

+0

@quark Eso no es exactamente correcto. No importa si los objetos están en el mismo hilo o no. Importa si el hilo que emite la señal es el hilo en el que se encuentra el objeto receptor. La documentación de Qt incluso se ha equivocado.Fuente: [Signals and slots across threads] (http://qt-project.org/wiki/Threads_Events_QObjects#913fb94dd61f1a62fc809f8d842c3afa). Estoy de acuerdo en que el comportamiento de Qt es lógico. –

9

La respuesta de laalto anterior es correcta. Sin embargo, un punto adicional: si todos sus QObjects pertenecen al mismo hilo y no ha especificado manualmente las conexiones en cola, entonces la ejecución de las ranuras conectadas a la señal se produce de forma síncrona; todo el procesamiento se realizará antes de la siguiente línea después del 'emitir 'declaración. Como este es el caso más común, la respuesta a su pregunta es normalmente 'sí'.

La documentación en signals and slots across multiple threads puede ser útil para usted.

25

El mayor problema es que no se puede saber. Es decir, si estás mirando desde el punto de vista de la clase. Cuando emites, usted no sabe lo que sucederá:

  • Si nadie está conectado a la señal, no pasa nada
  • Si alguien del mismo hilo se conecta mediante cualquier tipo, excepto Qt :: QueuedConnection, la llamada se bloquea
  • Si alguien del mismo hilo se conecta usando Qt :: QueuedConnection, la llamada será de no bloqueo
  • Si alguien de un hilo diferente se conecta usando Qt :: DirectConnection (tener mucho cuidado cuando ¡haz eso!) o Qt :: BlockingQueuedConnection, la llamada estará bloqueando
  • Si alguien de un hilo diferente se conecta usando Qt :: Auto Unión o Qt :: QueuedConnection, la llamada será de no bloqueo

Se hace aún más difícil saber qué va a pasar si varios objetos están conectados a la señal. En ese caso, algunas ranuras podrían haberse ejecutado mientras que otras todavía están en cola. No hay, por cierto, ningún hilo involucrado con una conexión sin bloqueo. Solo hay un evento que se publica en el bucle de evento del hilo del objeto receptor.

Cuestiones relacionadas