QProgressDialog für werte > int ?

Alles rund um die Programmierung mit Qt
Antworten
Mati
Beiträge: 66
Registriert: 4. Januar 2006 00:11

QProgressDialog für werte > int ?

Beitrag von Mati »

Hallo allerseits,
ich habe folgendes Problem:

Ihc laufe eine schleife z.B 500 000 mal durch.
Ich habe einen ProgressDialog der diesbezüglich upgedated werden soll.
Als Maximalwert sind aber nur int - werte zugelassen für den Dialog. Ich könnte natürlich hergehen und eine if-Abfrage mit Modulo Rechnung in die Schleife hauen so dass z.B bei jedem 500sten durchlauf um eins der dialog inkrementiert wird. Das raubt mir aber in der schleife saftig Zeit. Ich brauche es eben performant.

Hat jemand ne Idee oder sehe ich vor Lauter Bäumen den Wald kaum?
Ich vermute im Moment dass ich ohne die Abfrage keine Chance habe....

Gibt es vielleicht sowas wie einen QProgressDialog wo nur hin und hergependelt wird so dass der user sieht dass was läuft?

Ich danke für jegliche Hilfe!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich glaube nicht dass die Modulo-Rechnung Dir die Zeit raubt sondern die 500000 Updates. Ich würde nur alle 500 - 1000 Durchläufe überhaupt den ganzen Progressbar aktualisieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mati
Beiträge: 66
Registriert: 4. Januar 2006 00:11

Beitrag von Mati »

danke für die Hilfe aber ich hatte die Aktualisierung eben unter der Modulo-rechnung.
d.h eben alle 500 Durchläufe eine aktualisierung was mir enorm Zeit geraubt hat. Ich schaus mir nochmal an...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Evtl. geht ja sowas falls die Modulo - Berechnung (if ((x%1000)==0) ) doch das Problem ist

Code: Alles auswählen

for(int i = 0 ; i < 1000; i++) {
  for(int j = 0 ; j < 5000; j++) {

  }
  updateProgress();
}
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mati
Beiträge: 66
Registriert: 4. Januar 2006 00:11

Beitrag von Mati »

danke chrisitan für die Hilfe...

leider kostet mich jeder Funktionsaufruf also sowohl ein qApp->processEvents() oder auch nur ein update() der progressDialogs immer einige 10 millisekunden Zeit. auch ein blosser pendelbalken als ProgressDialog frisst das. Die Modulo-Rechnung dagegen fast nichts...
Hat jemand vielleicht eine performante Alternative anzubieten? Evtl. ein statischer Dialog der nur eine Message anzeigt?
Würde es mit einem animierten Gif funktionieren? Ich meine so als Bild des pendelnden Balkens? Nur so ne (dumme) Frage...

Danke
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Hätte ch eigentlich gestern schon erwähnen sollen - cpu-Lastige Operationen sollten in einen eigenen Thread. Dieser schickt dann per QCustomMessage (Qt3) oder signal (Qt4, wenn es geht, ansonsten QEvent) ein paar Statusinfos welche dann der Hauptthread anzeiget.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

In Qt 4 und Signals aber nicht den Parameter Qt::QueuedConnection im connect vergessen, bzw. dann das registrieren von eigenen Typen.

siehe Qt::ConnectionType

mfg
uhu01
Mati
Beiträge: 66
Registriert: 4. Januar 2006 00:11

Beitrag von Mati »

Hallo,
vielen Dank für eure Ideen wiedermals.
Wenn ihr noch Zeit habt :P und Lust habt zu antworten würde es mich wirlich interessieren ob ich es doch performant hinbekommen könnte einen QProgressDialog darzustellen.
@Christian: Denkst du über einen eigenen Thread würde es dann problemlos ohne sichtlichen Zeitverlust (evtl. im Bereich 0,001 sekunde also 1 milli sekunde) gehen?
@ups: Hab versucht mich bisschen schlau zu machen - hab aber deinen letzten Post nicht wirklich ganz verstanden :(

Danke euch vielmals! :)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da dann der GUI-Thread nicht die Ausführung deiner Berechnung (und umgekehrt) blockiert und dadurch erst gezeichnet wird wenn dieser dran ist, sollte es flüssiger werden. Ausserdem kann man so einen schönen Abbrechen-Button einbauen :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten