Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mehrere Prozeduren "gleichzeitig" ausführen (https://www.delphipraxis.net/67040-mehrere-prozeduren-gleichzeitig-ausfuehren.html)

mumu 8. Apr 2006 13:24


Mehrere Prozeduren "gleichzeitig" ausführen
 
ich hab ein projekt mit mehreren formularen. ich ruf jetzt mehrere formulare auf, die größere Proceduren ausführen... jedoch wird dabei immer die zuvor aufgerufene formularprozedur unterbrochen, bis die neu aufgerufene prozedure beendet wurde.

wie kann ich es hinbekommen, dass die ganzen formulare quasi gleichzeitig ausgeführt werden, ohne dass ich alle langwierigen prozeduren der ganzen formulare in einen thread auslagere. reicht es, wenn ich den aufruf des formulars in einen neuen thread auslagere?

vielen dank schonma

Luckie 8. Apr 2006 13:26

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
Da Stichwort heißt: Threads.

faux 8. Apr 2006 13:28

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
Hallo!

Wenn du nicht alles in Threads auslagern willst, kannst du mit ProcessMessages() bewirken, dass die Formulare weiter ihre Ereignisse ausführen (zb Paint).
Is aber eher ein Work-Arround als eine vernünftige Lösung.


Zitat:

Zitat von Luckie
Da Stichwort heißt: Threads.

Das will er nicht (wieso auch immer), hat er geschrieben.

Grüße
Faux

mumu 8. Apr 2006 13:31

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
mich interessiert eigentlich eher, ob es reicht wenn ich folgendes in einem thread auslagere:
Delphi-Quellcode:
  Formular := TForm2.Create(Self);
  Formular.show;
oder muss ich wirklich jede einzelne große funktion aus den formularen in einen thread auslagern?

pacman1986 8. Apr 2006 13:31

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
weil es ziemlich lange dauern würde das alles nochmal umzuschreiben schätze ich

edit : sry roten balken net gesehen

mumu 8. Apr 2006 13:34

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
ja aber genau das ist der hintergrund. es würde zu lang dauern jede große funktion in einen thread auszulagern

Luckie 8. Apr 2006 13:36

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
Das ist der Preis den man zahlen muss, wenn man seinme Anwnedung vorher nicht richtig durchdenkt. ;)

SirThornberry 8. Apr 2006 13:41

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
du musst doch nicht die ganze procedure in einen Thread packen. Es reicht doch wenn du aus dem Thread heraus die andere Procedure aufrufst denn dann läuft die Procedure im Thread.

negaH 8. Apr 2006 15:32

Re: Mehrere Prozeduren "gleichzeitig" ausführen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz