Ich habe eine Launcher-Anwendung, die fork
und exec
eine Qt-Anwendung, wenn der Benutzer auf das entsprechende Symbol klickt.Gibt es eine Möglichkeit festzustellen, wann das Hauptfenster der Qt-Anwendung angezeigt wird?
Für visuelle Rückmeldungen möchte ich einen Warte-Cursor anzeigen, wenn der Benutzer ein Symbol auswählt, bis das Hauptfenster der angeforderten Anwendung angezeigt wird.
void RocketLauncher::onItemSelect(QListWidgetItem* item)
{
QApplication::setOverrideCursor(Qt::WaitCursor);
const AppConfig& app = getAppConfig(item);
forkAndExec(app.cwd(), app.cmd(), app.args(), app.env());
// TODO: wait until app's main window is being displayed
QApplication::restoreOverrideCursor();
}
Das Problem, das ich habe, ist, dass app in meinem Launcher, ich das Kind Prozess pid von fork
sofort zurück, aber es dauert noch einige Zeit für das Kind Prozess exec
und für seine Hauptfenster erscheint auf dem Bildschirm.
Als solche wird mein Aufruf an QApplication::restoreOverrideCursor()
sofort ausgeführt, und es gibt keinen visuellen Hinweis für den Benutzer, dass die Anwendung noch gestartet wird.
Kann ich irgendwie signalisieren, dass das Kind läuft?
Ich glaube nicht einen Faden Wenn Sie einen Dateideskriptor von einer Pipe haben, können Sie '' QSocketNotifier'' im Hauptthread verwenden, um benachrichtigt zu werden, wenn jemand in die Pipe schreibt. –
Sicher ist es eine gute Lösung, außer dass es notwendig ist, eine Zeitüberschreitung zu verwalten. In diesem Fall müssen Sie einen QTimer erstellen und mit dem Timeout umgehen. Es wird komplexer, wenn das Programm mehrere Programmanfragen gleichzeitig bearbeitet ...? – requinham
Über * "vielleicht können Sie mit Creatin eine Datei in/tmp testen, aber ist eine schlechte Idee" *, es ist nicht sehr elegant, aber ich würde es nicht eine absolut schlechte Idee nennen. Zum einen ist es sehr portabel, einfach zu implementieren und zu verstehen, und leicht zu sehen und zu testen funktioniert alles richtig (obwohl Dateiname die PID des Kindes enthalten sollte, und Eltern sollten auch den Zeitstempel der Datei überprüfen, um sicherzustellen, dass es ist nicht veraltet, und QFileSystemWatcher sollte anstelle der einfachen QTimer-Abfrage verwendet werden, um nach der Datei zu suchen. – hyde