Graphik anzeige verbessern



  • Ciao Zäme

    Da ich nun das mit den Threads verstanden habe, habe ich ein kleines Beispiel zum Üben erstellt. Es handelt sich um ein Bildschirmschoner. Mit dem Programmstart werden zwei Threads gestartet welche je eine Kugel über den Bildschirm schieben.

    Doch der Bildaufbau befriedigt mich nicht. Die Kugeln flakern zimlich. Und dies stört mich. Damit Ihr euch ein Bild von meinem Programm machen könnt, habe ich das Projekt auf meine Homepage zum Download gestellt.

    [url]
    http://www.robbisoft.ch/Projekt_schoner.zip
    [/url]

    Es ist nicht so dringend, aber vielleicht hat jemand von euch eine Idee wie ich den Bildschirmschoner verbessern könnt. Nicht nur den Graphischen aufbau.

    Ich bin gespannt auf eure Ideen. Schon mal herzlichen Dank.

    Gruss Renato



  • Ich habe mir deinen Quelltext nicht näher angeguckt, benutzt du eine TPaintBox zum Zeichnen deines Bildschirmschoners?



  • Ich hab mal kurz reingeschaut. Im Kugel-Thread wird auf Variablen des Formulars zugegriffen, ohne das Synchronize() verwendet wird. Das hat zwar mit dem Flackern nichts zu tun, ist aber ein Fehler, der früher oder später zu 'unerwartetem Verhalten' des Programms führen wird.

    Man muss nicht zwingend Synchronize() verwenden, es gibt auch andere Methoden, Objekte Threadsicher zu gestalten. Aber darauf verzichten darf man nicht.



  • du greifst, wenn ich das richtig sehe, auf diverse über den Designer festgelegte GUI Objekte zu und verschiebst diese.
    Wann gezeichnet wird, hängt von der VCL Implementierung ab, dass es flackert wundert mich nicht.

    Wenn du vernünftige Graphik erstellen willst, mach das so:
    1. Verwende eine Zeichenfläche. Entweder einen device context von Windows GDI oder einen VCL Wrapper dafür
    2. Zeichne auf diese Zeichenfläche, z.B. mit FillRect
    3. Erst wenn alles fertig gezeichnet ist, nimmst du das Bild und kopierst es in den Bildschrimspeicher, das macht man mit BitBlt

    Damit gibt es dann auch kein Flackern mehr.



  • Die Kugeln schiebe ich in TImage über den Bildschirm. Eine PaintBox verwende ich nicht. Ich werde dies mal anschauen.

    Ebenfalls der Tip mit Synchronize muss ich anschauen. Sowas habe ich noch nie verwendet. Mal schauen was sich damit machen lässt.

    Gruss Renato



  • Auch wenn du Threadprogammierung lernen möchtest - für die Grafikanzeige verwende einfach eine TTimer-Komponente.



  • Th69 schrieb:

    Auch wenn du Threadprogammierung lernen möchtest - für die Grafikanzeige verwende einfach eine TTimer-Komponente.

    Ja, das wäre für den Anfang vielleicht besser. Multi-Threading ist nicht einfach.

    Mach es doch erst mal ohne und wenn das läuft, versuchst Du dich an der Multi-Threaded-Version. Dazu ein paar Tipps: Niemals aus einem Thread heraus zeichnen. Niemals auf Objekte in anderen Threads zugreifen, ohne diese vorher gegen weitere, zeitgleiche Zugriffe abzuscichern (zB eben Synchronize() verwenden).
    In diesem spezifischen Fall würde ich im Thread nur die Kugelposition berechnen und das Ergebnis zB als Non-Blocking-Nachricht senden. Im Thread würde ich als zeitgesteuerte Schleife wohl WaitForSingleObjekt() verwenden (um den Thread beenden zu können, das wäre der Event auf den gewartet wird). Dann eben immer nur 100 ms warten lassen und 'dazwischen' die neue Position berechnen und in die Nachrichtenwarteschlange stellen. Das fände ich eleganter... 😉


Log in to reply