Seite 1 von 1

Button bei Funktionsabarbeitung (Browser Stop Button Art)

Verfasst: 13. Januar 2005 12:40
von FlorianBecker
Hallo,

wie kann ich eigentlich Buttons verwenden, wenn ich gerade Funktionen abarbeite, z.B. nach dem Prinzip des Stop Buttons eines Browser, der immer drückbar ist, obwohl ich ja eine Seite lade. Wie kann ich jetzt einen Cancel oder Close Button erstellen, der während einer Aufgabe auch drückbar ist? Bisher kann ich den Button einfach nicht drücken, weil er ja eben nicht paralell arbeiten kann. Sollte man das mit deinem Timer lösen können?

Wäre dankbar, wenn mir jmd. einen kurzen Denkanstoß in die richtige Richtung geben könnte.

MfG

Verfasst: 13. Januar 2005 14:02
von Goos
Hi :)

Funktionen abarbeiten solltest wohl besser in einem separatem Thread.
Dein GUI sollte davon wohl unbelastet und somit staendig einsaetzfaehig sein.

Goos

Verfasst: 13. Januar 2005 14:13
von FlorianBecker
Ja, genau so dachte ich mir das, nur wollte ich die Threads nicht anfassen. Geht das mit Qt4 ohne Threads anfassen? Weisst du das zufällig? Ansonsten danke für deine Hilfe. Thread ist mit kurz nach absenden des Beitrages eingefallen, allerdings versuche ich möglichst die Finger von denen zu lassen.

Verfasst: 13. Januar 2005 14:21
von Goos
Wieso willst die Finger von Threads lassen? :)

Es gaebe sicherlich auch Bastelloesungen ohne Threads, aber die halte ich dann fuer nicht wirklich sauber.

Goos

Verfasst: 13. Januar 2005 14:27
von FlorianBecker
Ja, das ist es eben auch wieder. Dank dir, damit komm ich sicher zu einer sauberen guten Lösung. Vielleicht kann ich dir ja auch mal weiterhelfen.

Schönen Tag.

Verfasst: 13. Januar 2005 14:39
von Goos
Also nun doch Threads?
Das Handling von QThreads ist meiner Meinung nach recht nett gemacht und schoen unkompliziert, also viel Spass dabei :)

Goos

Verfasst: 13. Januar 2005 14:41
von FlorianBecker
Na klar, von Übergangslösungen halte ich persönlich eigentlich gar nicht soviel, dachte nur, vielleicht gibt es eine schöne Möglichkeit trotzalledem ohne Threads.

Verfasst: 13. Januar 2005 15:00
von Spring-Daniel
QTimer waere aber dennoch auch eine Alternative...

In Qt3 & Qt4 Doku heisst es dazu:
As a special case, a QTimer with a timeout of 0 will time out as soon as all the events in the window system's event queue have been processed. This can be used to do heavy work while providing a snappy user interface
...
This is the traditional way of implementing heavy work in GUI applications; multithreading is now becoming available on more and more platforms, and we expect that zero-milliseconds QTimers will gradually be replaced by QThreads.
Mh, mag zwar personelich Threads auch nicht unbedingt, aber evtl. sollte man doch mal dazu greifen.
Aber vorher sich am besten gut mit der Materie vertraut machen - Ich denke, die einfache Handhabung von Threads in Qt kann sehr schnell zu boesen Fehlern fuehren, wenn man sich nicht genau mit der Materie auskennt ( auch ein Grund warum ich bisher immer die Finger davon gelassen hab )

Daniel

Verfasst: 14. Januar 2005 09:21
von ArneStocker
In einem modalen Dialog fällt mir folgende relative einfache Lösung ein :

Du könntest innerhalb Deines Berechnungsalgorithmus gelegentlich ein qApp->processEvents(100) aufrufen. Damit wird die Eventschleife aufgerufen und es sind Benutzereingaben und das Neuzeichnen des Bildschirms möglich.

Dein CloseButton könnte dann mit einer Methode verbunden werden, die eine membervariable (z.B. m_abbruch) auf true setzt. Innerhalb Deiner Berechnung kannst Du (in den gleichen Abständen in denen Du qApp->processEvents(100) aufrufst auf m_abbruch prüfen.

PS.: Du musst dann wohl auch auf das Schliessen des Fensters durch den Anwender reagieren und in diesem Fall ebenfalls die Berechnung beenden. Vielleicht hilfts !

Gruss Arne

Verfasst: 14. Januar 2005 13:17
von FlorianBecker
Aha, das klingt ganz gut. Das werde ich mal ausprobieren, weil mit dem ProcessEvent Teil habe ich bisher nie schlecht gelegen.

Allerdings fällt mir da noch eine weitere Schwierigkeit ein, wie kann ich denn Berechnen, wie lange eine Funktion zum auflauf auf dem jeweiligen eigenen System dauert? Ist das überhaupt durch die Funktion möglich, oder geht das nur über zumutungen wie Windows das mit dem Datei kopieren macht:
Restdauer geschätzt : 5 min
und dann auf einmal
Restdauer geschätzt : 20 min

Weil selbst das kopieren in einem Konqueror kopier Dialog ist einfach zu schwammig.

Verfasst: 14. Januar 2005 18:49
von ArneStocker
wie lange eine Funktion zum auflauf auf dem jeweiligen eigenen System dauert?
.. bitte was soll berechnet werden ?

Gruss Arne

Verfasst: 14. Januar 2005 19:36
von FlorianBecker
Verwirrt? hehe.

Naja, meine Äußerung scheint ein bischen unmöglich zu sein. Berechnen der Zeit, die für das ausführen einer bestimmten Funktion gebraucht wird, ohne das Sie vorher ausgeführt wurde. Es also keine bereits bekannten Werte bestehen, zumal das Ergebnis nicht bei jeden ablauf gleich schnell sein wird. Mit jeweils eigenem System meinte ich:
Wenn du einen P III hast wird eine bestimmte Funktion länger dauern als auf einem Dual Opteron.

Verfasst: 14. Januar 2005 19:50
von ArneStocker
ich beginne zu verstehen ...

wahrscheinlich kannst Du nur versuchen hochzurechnen. Wenn es Dir gelingt, Deine Berechnung in eine bestimme Anzahl (geschätzter nahezu) gleichgrosser Teilberechnungen (oder Aktionen) zu unterteilen, kannst Du bereits nach der ersten Teilberechnung eine Hochrechnung für die Restdauer anstellen. Diese Hochrechnung wird dann umso genauer, je mehr Teilberechnungen Du durchgeführt hast.

Das Ergebnis wird dann genauso optimal sein, wie die Zeitangaben beim Kopieren unter Windows :-)

Gruss Arne