Seite 1 von 1
[gelöst] Start event loop
Verfasst: 24. Mai 2005 19:04
von sh
Hallo,
ich habe für eine etwas zeitaufwendigere numerische Rechnung ein Progrämmchen mit Qt geschrieben, welches den Verlauf und das Ergebnis anzeigt ... Das Programm soll die Simulation (in Klasse Sim) nach Starten der Ereignisschleife anschubsen, ansonsten gibt es immer irgendwelche Probleme.
Meine bisherige Lösung sieht so aus (Stück von main() ):
Code: Alles auswählen
Sim* mysim = new Sim( "some args" );
QTimer::singleShot( 100, mysim, SLOT( startSim() ) );
return myapp.exec();
Das ist zwar simpel, aber das kann ja nicht der Weisheit letztet Schluß sein! Kann man nicht das Starten direkt in die event queue oder so eintragen? Oder gibt es da eine Standardlösung, die außerhalb meiner beschränkten C++ Kenntnisse liegt?
Vielen Dank.
Verfasst: 24. Mai 2005 19:16
von FlorianBecker
Wo genau gibt es denn Probleme?
Also normalerweise macht man folgendes:
Code: Alles auswählen
Sim* mysim = new Sim( "some args" );
mysim -> startSim();
return myapp.exec();
Verfasst: 24. Mai 2005 23:45
von lepsai
Nein, nein, der Kollege hat schon Recht: bevor die qApp->exec() aufgerufen wird, läuft der Event-Loop nicht. So gesehen ist die Lösung mit singleShot() korrekt. Aber ich verstehe nicht, was der Genosse noch mehr will. Vielleicht möchte er den Startzeitpunkt der Berechnung steuern, dann braucht er ein Button oder einen Menüpunkt. Will er die Zwischenergebnisse auf der Oberfläche anzeigen, so sollte er entweder Threads oder (viel einfacher) qApp->processEvents() benutzen...
Für weitere intellegentere Vorschläge wäre eine genauere Beschreibung der Ziele und Wünsche von Vorteil....

Verfasst: 25. Mai 2005 08:37
von FlorianBecker
Warum wartet man denn, bis der Event Loop aufgerufen wurde?
Verfasst: 25. Mai 2005 14:14
von sh
Das Problem hat sich halbwegs gelöst.
Der Kern des Problems ist, wenn mysim die Kontrolle nicht wieder an main() zurückgibt und irgendwelchen Mist macht - abstürzen, child-Prozess erzeugen und Fehler hervorrufen ... dann hast du am Ende einen Zombie-Prozess, weil die Event-Schleife noch nicht gestartet wurde.
Die relevanten Teile im mysim scheinen jetzt stabil zu sein bzw. laufen erst später ab und mysim gibt ab und zu per "processevent()" mal die Kontrolle ab. So funktionieren nun beide Lösungen ohne Probleme.
Es ist daher nun eine philosophische Frage: Wenn meine eingestellten 100ms nun nicht reichen oder die Lösung als durchdieBrustinsAuge empfindet, was tut man dann?
Allerdings kann ich jetzt spontan auch keinen Fall konstruieren, wo "singleShot" zwingend nötig wäre - irgendwie das ein erzeugtes Objekt schon bei der Initialisierung etwas tut, was eine laufende Ereignisschleife voraussetzt.
Vielen Dank