AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Threads mit Oberfläche synchronisieren (VCL)
Tutorial durchsuchen
Ansicht
Themen-Optionen

Threads mit Oberfläche synchronisieren (VCL)

Ein Tutorial von sakura · begonnen am 25. Jan 2017 · letzter Beitrag vom 26. Jan 2017
 
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#1

Threads mit Oberfläche synchronisieren (VCL)

  Alt 25. Jan 2017, 15:08
Hallo zusammen,

anbei habe ich ein kleines Beispiel für die Synchronisierung von Threads mit der Anzeige erstellt.

Was wird demonstriert

In der Demo-Anwendung werden vier Szenarien demonstriert. Einmal Threads mit wenig Arbeit bis zur Darstellung von Informationen, und einmal Threads, welche mehr erledigen müssen, bevor Daten dargestellt werden. Beide Varianten stellen die Daten einmal direkt in der Anwendung dar (mittels Synchronize) und einmal mittels einem Zwischenspeicher. (2 x 2 Varianten = 4 verschiedene Szenarien).

Wie wird demonstriert

Die Demo besteht aus zwei Units
  1. MainForm: Anzeige der Werte und Steuerung der Threads

    Über die RadioGroup kann der Demo-Modus ausgewählt werden.
    Beim Klick auf den RUN-Button werden 5 Threads mit verschiedenen Startwerten erstellt.
    Im Label (ganz unten) wird dargestellt, wieviele Threads laufen, bzw. wie lange die Verarbeitung gedauert hat.
    Der Timer lädt generierte Daten in das Memo (wenn, welche vorhanden sind)
  2. Threads: Stellt die Thread-Klasse zur Verfügung

    Ein Klasse für alle Szenarien. Berechnet wird die Summe aller Zahlen von 1 bis zum übergebenen Startwert.
    Wenn ein hoher Aufwand simuliert wird, wird nach jeder Addition eine kleine Pause eingelegt (Sleep).
    Anschließend wird der aktuelle Zwischenstand verkündet. Entweder über eine direkte Darstellung in der Oberfläche, ober die Daten werden in eine threadsichere Liste gespeichert.

Was wird NICHT demonstriert

Der gemeinsam genutzte Speicher TMyData = TThreadList<string>; ist nicht die performanteste Variante, aber sie ist leicht zu verstehen. Je nach Datentypen, welche synchronisiert werden, muss man sich Gedanken machen, wie diese hinterlegt werden. Das kann eine Datenbank sein, eine einfache Variable, eine Klasse, oder wie hier gezeigt eine threadsichere Liste, oder, oder, oder...

Sleep() ist nicht die beste Methode, einen hohen Workload zu simulieren, da der Thread nichts zu tun hat, für die Demo ist es aber ausreichend.

Werte der Szenarien

Wenig Arbeit
  • Direkt synchronisieren
    875 ms
    als Basiswert: 100%
  • mittels Zwischenspeicher synchronisieren
    16 ms
    relativ: 1,8%

Viel Arbeit
  • Direkt synchronisieren
    7000 ms
    als Basiswert: 100%
  • mittels Zwischenspeicher synchronisieren
    5718 ms
    relativ: 81,7%

Man erkennt also, dass, je mehr der Thread wirklich arbeitet, der Vorteil des Zwischenspeichers abnimmt. Aber, es ist immer noch eine signifikante Verbesserung (20%), welche gerade bei langwierigen Aufgaben bemerkbar wird.

Erkenntnisse: Threads manchmal eventuell useless

Gerade wenn Threads viele Informationen an die UI senden, und diese mittels Synchronize durchgeführt werden, fällt auf, dass es schnell dazu kommt, dass die UI nicht mehr auf User-Aktivitäten reagiert, da die Synchronisierung zu viel Zeit in Anspruch nimmt.

Abschließende Worte

Bei diesem Tutorial geht es nicht so sehr um die Verwendung von Threads, und wie man diese nutzt, sondern um ein einfaches Beispiel, wie ihr die generierten Daten zur Laufzeit in die Oberfläche bekommt. Dabei ist es sicherlich nicht sinnvoll, so wie hier gezeigt, jeden einzelnen Schritt darzustellen.

......

Keine Ahnung, wie ich Anhänge updaten kann, korrigierte Version weiter unten: http://www.delphipraxis.net/191536-t...ml#post1360002
Angehängte Dateien
Dateityp: zip Threading.zip (8,2 KB, 60x aufgerufen)
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so

Geändert von sakura (26. Jan 2017 um 08:48 Uhr) Grund: Update des Anhangs.
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz