Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 15:32
Die VCL vom Delphi und auch das GDI von Windows ist nicht threadsafe. Du kannst also alles was mit sichtbaren Controls zu tun hat nicht in Threads auslagern, besonders eben keine TForms.

Du musst die langandauerenden Funktionen die deine Formulare steuern in Threads auslagern. Dadurch erhöht sich aber auf Single CPU Maschinen nicht die Performance deiner Anwendung, sprich im Normalfalle wird die Gesamtlaufzeit aller länger andauernden Funktionen größer sein als vorher. Ein weiterer Preis den du zahlen wirst ist die Synchronisation zwischen diesen Threadfunktionen und dem GUI. Diese ist komplex, fehleranfällig und kostet nochmals Rechenzeit.

Eine Alternative ohne Threads wäre es alle längerdauernden Funktionen durch eigene "Warteschleifen" per Hand zu unterbrechen und somit quasi jede dieser Funktionen Stückchenweise abarbeiten zu lassen. Der Preis den du jetzt zahlst ist das du alles selber bauen musst, die Funktionen unübersichtlich werden, die Funktionen selber nicht mehr reentrant sind und somit vor "rekusiven" Aufrufen explizit geschützt werden müssen.

Die dritte Alternative ist es die Funktionen so umzuschreiben das sie Stückchenweise ihre Arbeit erledigen können. D.h. alle Aufgaben die deine Funktionen erledigen werden komplett in viele kleine Teilaufgaben zerlegt. Man könnte nun eine solche teilaufgabe als Objekt bauen. Diese teilaufgaben-Objekte kannst du nun in einer Job-Liste verwalten und abarbeiten. Sobald ein solcher Teil-Job in der Job-Liste erledigt wurde erzeugt dieser Teil-Job einen neuen Job der sich von der Arbeitsaufgabe logisch ergäbe.

Sähe so aus:

Code:

Job   Aufgabe Teilproblem

#1       #1       #1.1
#2       #2       #2.1
#3       #3       #3.1

#4       #1       #1.2
#5       #2       #2.2
#6       #3       #3.2
Obige Liste erledigt Job Nummer 1, also den Teil #1.1 aus der Aufgabe #1. Wenn der fertig ist erzeugt dieser Job vor seiner Zerstörung den logisch nachfolgenden Teiljob #1.2 zur Aufgabe #1 als neuen Job #4 in der Liste. Danach wird er aus der Jobliste entfernt. Die Jobliste arbeitet dann die Teilaufgabe #2.1 ab die wenn sie fertig ist in die Liste Job #5 -> #2.2 einfügt. Im Grunde arbeitet der preemptive Task Scheduler, Threads, unter Windows identisch, mit dem Unterschied das die Aufgabe ein ganzer Task ist und die Teilaufgaben nur Zeitscheiben der Gesamtrechenzeit darstellen.


Gruß Hagen
  Mit Zitat antworten Zitat