AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere Prozeduren "gleichzeitig" ausführen

Ein Thema von mumu · begonnen am 8. Apr 2006 · letzter Beitrag vom 8. Apr 2006
 
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
 


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 20:54 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