![]() |
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 |
Re: Mehrere Prozeduren "gleichzeitig" ausführen
Da Stichwort heißt: Threads.
|
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:
Grüße Faux |
Re: Mehrere Prozeduren "gleichzeitig" ausführen
mich interessiert eigentlich eher, ob es reicht wenn ich folgendes in einem thread auslagere:
Delphi-Quellcode:
oder muss ich wirklich jede einzelne große funktion aus den formularen in einen thread auslagern?
Formular := TForm2.Create(Self);
Formular.show; |
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 |
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
|
Re: Mehrere Prozeduren "gleichzeitig" ausführen
Das ist der Preis den man zahlen muss, wenn man seinme Anwnedung vorher nicht richtig durchdenkt. ;)
|
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.
|
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:
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.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 Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 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 by Thomas Breitkreuz