Button bei Funktionsabarbeitung (Browser Stop Button Art)

Alles rund um die Programmierung mit Qt
Antworten
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Button bei Funktionsabarbeitung (Browser Stop Button Art)

Beitrag 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
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Hi :)

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

Goos
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

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

Beitrag 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.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

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

Beitrag 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.
Spring-Daniel
Beiträge: 40
Registriert: 4. Oktober 2004 16:26

Beitrag 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
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

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

Beitrag 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.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

wie lange eine Funktion zum auflauf auf dem jeweiligen eigenen System dauert?
.. bitte was soll berechnet werden ?

Gruss Arne
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

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