Fortschrittsbalken während Rechenintensiver Anwendung



  • Hallo,

    ich habe mir mit Freunden zusammen einen Plotter selbst gebaut. Nun haben wir eine C++-VCL-Anwendung geschrieben, mit dem man die Bilder drucken kann. Da die Bilder in Monochrome umgewandelt werden müssen, habe ich den Floyd-Steinberg-Algorithmus implementiert.
    Der ist aber relativ langwierig. Um dem Benutzer wenigstens eine Rückmeldung zu geben, dass das Programm läuft und nicht abgestürzt ist, würde ich gerne einen Fortschrittsbalken anzeigen, bei dem angezeigt wird, wie viel Prozent des Bildes schon berechnet ist (Sollte zu machen sein, ich weiß ja wie Groß das Bild ist und an welcher Stelle ich grad hänge!)

    Hat da jemand eine Idee? Im Moment hängt das ganze Programm. Müsste ich da jetzt einen neuen Thread (im Programmiersinne^^) aufmachen um gleichzeitig zu arbeiten?



  • Hallo

    Entweder TProgressBar und TThread oder TProgressBar und Application->ProcessMessages, wobei ersteres besser ist. Zu den Stichworten solltest du hier im Forum mit der Suchfunktion auch genug Hinweise finden.

    bis bald
    akari



  • kanedo schrieb:

    Der ist aber relativ langwierig.

    Wie machst du das denn? Ich kann mich erinnern, auch mal den Floyd-Steinberg-Algorithmus implementiert zu haben, und ich glaube, die Verzögerung war fast nicht meßbar.

    kanedo schrieb:

    Müsste ich da jetzt einen neuen Thread (im Programmiersinne^^) aufmachen um gleichzeitig zu arbeiten?

    Ja. Aber ich glaube, in dem Fall wäre das Verbessern deines Algorithmus zielführender 🙂



  • Also danke euch für eure Antworten.

    kanedo schrieb:

    Müsste ich da jetzt einen neuen Thread (im Programmiersinne^^) aufmachen um gleichzeitig zu arbeiten?

    Ja. Aber ich glaube, in dem Fall wäre das Verbessern deines Algorithmus zielführender :)[/quote]
    Ich habe das nach folgendem "Tutorial" gemacht:
    http://en.literateprograms.org/Floyd-Steinberg_dithering_(C)

    Hast du eine bessere Variante das zu implementieren?



  • kanedo schrieb:

    Ich habe das nach folgendem "Tutorial" gemacht:
    http://en.literateprograms.org/Floyd-Steinberg_dithering_(C)

    Hast du eine bessere Variante das zu implementieren?

    Der grundlegende Algorithmus ist schon okay. Ich habe mich da unpräzise ausgedrückt; ich meinte, du müssest vermutlich deine Implementation des Algorithmus überarbeiten. Vielleicht kannst du sie mal posten?



  • Hallo
    Ich weiß ja nicht, ob dies hier zutrifft, aber ich hatte da auch eine Anwendung mit TProgressBar ohne irgendwelche Algorithmus. Einfach eine Textdokument (TStringList) und bei jeder Zeile wurde die ProgressBar aktuallisiert mittels 'Application->ProcessMessages'. Unter WIN-XP kein Problem, aber unter WIN7 wurde es quälend langsam, sodaß ich die ProgressBar durch ein einfaches Infofenster ersetzte (BCB2007). Übrigens auch das Compilieren von großen Programmen ist unter Win7 eine Qual gegenüber XP, jedenfalls bei BCB2007, die anderen kann ich nicht einschätzen. Microsoft sollte auf Geschwindigkeit setzen und nicht auf optischen SchnickSchnack.



  • audacia schrieb:

    Vielleicht kannst du sie mal posten?

    Ich habs mal hochgeladen. Ist glaub ich übersichtlicher als hier im Forum:

    *.cpp:
    http://dl.dropbox.com/u/835372/Unit1.cpp
    *.h:
    http://dl.dropbox.com/u/835372/Unit1.h



  • Ja, so etwas ähnliches habe ich mir schon gedacht.

    - TCanvas::Pixels[] ist relativ langsam. Du solltest lieber TBitmap::ScanLine verwenden.
    - Das hier hat mich etwas amüsiert:

    RGBTriple Dithering::ColorToRGB(TColor rgb){
    			String r = ColorToString(rgb).SubString(8,2);
    			String g = ColorToString(rgb).SubString(6,2);
    			String b = ColorToString(rgb).SubString(4,2);
    			int iR, iG, iB;
    			sscanf(r.c_str(), "%x", &iR);
    			sscanf(g.c_str(), "%x", &iG);
    			sscanf(b.c_str(), "%x", &iB);
    			RGBTriple result;
    			result.R = iR;
    			result.G = iG;
    			result.B = iB;
                return result;
    }
    TColor Dithering::RGBToColor(RGBTriple rgb){
       return RGB(rgb.R, rgb.G, rgb.B);
    	if(rgb.R == 0 && rgb.G ==0 && rgb.B ==0)
    	{
    		return clBlack;
    	}else {
            return clWhite;
        }
    }
    

    Es ist etwas ungeschickt, eine derartige Berechnung mit Strings durchzuführen. Aber ich will jetzt nicht weiter darauf eingehen, sondern dich darauf verweisen, daß es
    - in der Delphi-RTL bereits ColorToRGB() gibt, und
    - RGBToColor ein Einzeiler ist:

    TColor myColor = TColor (RGB (r, g, b));
    

Log in to reply