2009-11-14 15 views
18

Si tuviera una clase A, donde una de sus funciones hace:Qt: ¿Los eventos se procesan en orden?

void A::func() 
{ 
    emit first_signal(); 
    emit second_signal(); 
} 

Suponiendo que una clase B tiene 2 ranuras, una conectada a first_signal, y el otro a second_signal, es que garantizada que la la ranura que está conectada a first_signal siempre se procesará antes de la ranura second_signal?

Respuesta

15

Si utiliza el tipo de conexión directa entre señales y ranuras (Qt :: DirectConnection), entonces la respuesta es sí.

De sistema de ayuda de Qt:

Cuando se emite una señal, las ranuras conectados a él se ejecutan normalmente de inmediato, al igual que una llamada función normal. Cuando esto sucede, el mecanismo de señales y ranuras es totalmente independiente de cualquier bucle de evento GUI. La ejecución del código que sigue a la declaración de emisión ocurrirá una vez que todas las ranuras hayan regresado. La situación es ligeramente diferente cuando se usan conexiones en cola ; en tal caso, el código seguido de la palabra clave emitirá será continuará inmediatamente, y las ranuras se ejecutarán más tarde.

Puede cambiar el tipo de conexión predeterminado a cualquiera de enum Qt::ConnectionType en el método QObject::connect.

+1

Creo que estaría garantizado siempre que tengan el mismo tipo, incluso si no es el predeterminado. El que está en cola creará dos eventos, cada uno con la misma prioridad, y esos eventos se procesarán en orden. Además, el tipo de conexión predeterminado es Qt :: AutoConnection, que se resuelve a dirigir siempre que el emisor y el receptor estén en el mismo hilo. –

+3

La frase inicial de su publicación debe decir 'Si usa el tipo de conexión DIRECTA entre señales y ranuras '; dado que el tipo predeterminado es 'Qt :: AutoConnection' que se comporta de manera diferente dependiendo de si el código de envío y el objeto de recepción viven o no en hilos diferentes. Consulte ['Qt :: ConnectionType' docs] (http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum) y [Threads, Events and QObjects] (http: // qt- project.org/wiki/Threads_Events_QObjects). – Hossein

+2

Si eligió Qt :: QueuedConnection (o Qt :: AutoConnection y la ranura estaba en un hilo diferente a la señal), por supuesto, la ranura se llamaría asincrónicamente, pero creo que la pregunta sigue en pie "¿Se garantiza que la ranura que está conectado a first_signal siempre se procesará antes de la ranura de second_signal? " Alguien tiene una respuesta? –

Cuestiones relacionadas