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.
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
@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. –