sabato 1 ottobre 2011

Qt: reboot automatico dell'applicazione

Una delle cose molto comode che il framework Eclipse RCP fornisce out-of-the-box è la capacità di riavviare automaticamente una applicazione. Qt non fornisce nulla del genere, ma non è difficile implementare un meccanismo per il reboot. In questo articolo sul Wiki ufficiale descrivo come implementare efficacemente il reboot. I passi fondamentali sono:
  1. creare una costante che sia associata al valore di uscita reboot
  2. modificare il  ciclo di vita dell'applicazione (main) affinche' usi un loop per processare l'applicazione. Il loop non termina fino a che il valore di uscita dell'applicazione non e' diverso dal valore di reboot.
  3. creare uno slot (ad esempio nella propria main window) per effettuare il reboot.
  4. creare una azione per gestire il reboot e connetterla allo slot di cui sopra.
Il nuovo ciclo main (punto 2) risulta quindi simile al seguente:

int main(int argc, char *argv[])
{
    int currentExitCode = 0;

    do{
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        currentExitCode = a.exec();

    }while( currentExitCode == MainWindow::EXIT_CODE_REBOOT );

    return currentExitCode;

}

ove ovviamente EXIT_CODE_REBOOT e' la costante definita ed opportunamente inizializzata. La MainWindow avra' uno slot (punto 3) simile al seguente:

void MainWindow::slotReboot()
{
    qDebug() << "Performing application reboot..";
    qApp->exit( MainWindow::EXIT_CODE_REBOOT );
}

e l'azione (punto 4) che gestisce il reboot sara' come la seguente:

    actionReboot = new QAction( this );
    actionReboot->setText( tr("Restart") );
    actionReboot->setIcon( QIcon(":/actions/img/reboot.png" ) );
    actionReboot->setStatusTip( tr("Restarts the application") );
    connect( actionReboot,
             SIGNAL(triggered()),
             this,
             SLOT(slotReboot()) );

Nessun commento: