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
Antwort Antwort
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:24
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:26
Da Stichwort heißt: Threads.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:28
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 von Luckie:
Da Stichwort heißt: Threads.
Das will er nicht (wieso auch immer), hat er geschrieben.

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#4

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:31
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?
  Mit Zitat antworten Zitat
pacman1986

Registriert seit: 11. Feb 2005
Ort: Kirchhain
498 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:31
weil es ziemlich lange dauern würde das alles nochmal umzuschreiben schätze ich

edit : sry roten balken net gesehen
Christian N.
Designed to make a difference

najjaronline.de
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#6

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:34
ja aber genau das ist der hintergrund. es würde zu lang dauern jede große funktion in einen thread auszulagern
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:36
Das ist der Preis den man zahlen muss, wenn man seinme Anwnedung vorher nicht richtig durchdenkt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Mehrere Prozeduren "gleichzeitig" ausführen

  Alt 8. Apr 2006, 13:41
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
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
Antwort Antwort


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 17:05 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