[gelöst] Start event loop

Alles rund um die Programmierung mit Qt
Antworten
sh
Beiträge: 3
Registriert: 24. Mai 2005 11:14

[gelöst] Start event loop

Beitrag 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.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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();
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.... :)
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Warum wartet man denn, bis der Event Loop aufgerufen wurde?
sh
Beiträge: 3
Registriert: 24. Mai 2005 11:14

Beitrag 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
Antworten