2012-06-27 16 views
5

Estaba cavando en algún código fuente en el que estoy trabajando. Encontré una declaración peculiar que alguien había codificado. El código fuente es una aplicación GUI con una GUI de QML y usa QT 4.7.x.Clase basada en QObject tiene una conexión en cola a sí mismo

El siguiente fragmento pertenece a la lógica de la aplicación central.

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

Es extraño que el objeto se conecta a sí mismo a través de una conexión en cola que significa esencialmente que el objeto puede "en vivo" en diferentes subprocesos al mismo tiempo?

A primera vista No tenía ningún sentido para mí. ¿Alguien puede pensar en alguna razón por la cual tal conexión sería plausible o necesaria? ¿Esto funcionaría?

Respuesta

9

Funcionará sin ningún problema. ¿Tal vez se requirió algún tipo de procesamiento de ciclo de evento antes de llamar a SetCurrentTaskSlot?

Tenga en cuenta que QueuedConnection no significa que algo tenga un hilo diferente. QueuedConnection significa solo que cuando se emite una señal, la ranura correspondiente no se llamará directamente. Se pondrá en cola en el bucle de evento y se procesará cuando se devuelva el control al bucle de evento

+0

Tiene sentido. Todavía estoy mirando las cosas que rodean el código. Así que volveré una vez que quede claro lo que está sucediendo. –

+1

Parece que se emite una señal de cambio de tarea mientras se realiza un cálculo y ese "cambio" no debería ocurrir inmediatamente, sino después de que se ejecuta el flujo actual y se reanuda el proceso del evento. –

3

La conexión en cola no implica nada acerca de dónde vive el receptor. Lo contrario es cierto: para enviar señales con seguridad a un objeto que vive en otro hilo, debe usar conexiones en cola. ¡Pero puedes usarlos para un objeto que viva en cualquier hilo!

Uno utiliza una conexión en cola para garantizar que la señal se entregará desde el bucle de evento, y no inmediatamente desde el sitio de emisión como sucede con la conexión directa. La conexión directa es conceptualmente un conjunto de llamadas a indicadores de función en una lista. La conexión en cola es conceptualmente un evento enviado a un receptor inteligente que puede ejecutar una llamada de función en función del contenido del evento.

El evento es el interno QMetaCallEvent, y es QObject::event que actúa sobre este evento y ejecuta la llamada.

Cuestiones relacionadas