Button bei Funktionsabarbeitung (Browser Stop Button Art)
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Button bei Funktionsabarbeitung (Browser Stop Button Art)
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
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
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
-
- Beiträge: 40
- Registriert: 4. Oktober 2004 16:26
QTimer waere aber dennoch auch eine Alternative...
In Qt3 & Qt4 Doku heisst es dazu:
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
In Qt3 & Qt4 Doku heisst es dazu:
Mh, mag zwar personelich Threads auch nicht unbedingt, aber evtl. sollte man doch mal dazu greifen.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.
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
-
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
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
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
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
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.
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.
-
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
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.
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.
-
- Beiträge: 300
- Registriert: 3. November 2004 16:15
- Wohnort: Berlin
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
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