Come QT Framework gestisce gli eventi provenienti dal sistema operativo?

0

Quando chiamiamo QApplication :: exec () alla fine della nostra funzione main (), l'applicazione entra nel ciclo degli eventi di Qt. Concettualmente, il ciclo degli eventi ha il seguente aspetto:

   while (!exit_was_called) {
    while (!posted_event_queue_is_empty) {
        process_next_posted_event();
    }
    while (!spontaneous_event_queue_is_empty) {
        process_next_spontaneous_event();
    }
    while (!posted_event_queue_is_empty) {
        process_next_posted_event();
    }
}

Innanzitutto, il ciclo degli eventi elabora qualsiasi evento registrato finché la coda non è vuota. Quindi, elabora gli eventi spontanei finché non ne rimane nessuno. Infine, elabora tutti gli eventi pubblicati che sono stati generati durante l'elaborazione degli eventi spontanei.

Quindi, un singolo thread (main () thread in un'applicazione GUI a thread singolo) non può gestire il programma e il loop di eventi (con funzionalità Event Queue). Esistono thread diversi da quelli principali creati per gestire gli eventi in QT?

    
posta sk patra 03.09.2013 - 14:24
fonte

1 risposta

1

una coda eventi è perfettamente in grado di gestire il programma principale senza affamare gli eventi spontanei semplicemente creando un nuovo evento da gestire successivamente e tornare al ciclo

nel codice è probabile:

Q_INVOKABLE void do_computation(int step=0){
    switch(step)
    {
        case 0:
        //do some computation
            QMetaObject.invokeMethod(this,"do_computation",Qt::QueuedConnection, Q_ARG(int,1));
            break;
        case 1:
        //continue the computation
            QMetaObject.invokeMethod(this,"do_computation",Qt::QueuedConnection, Q_ARG(int,2));
            break;
        default: return;
    }

}

utilizzando QueuedConnection ritarda la spedizione fino alla prossima esecuzione del ciclo; eventualmente permettendo ad altri eventi di essere gestiti per primi

per ulteriori approfondimenti suggerisco di leggere l'articolo sul wiki di Qt su discussioni ed eventi

    
risposta data 03.09.2013 - 15:19
fonte

Leggi altre domande sui tag