Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi progressform, mehrere funktionen parallel (https://www.delphipraxis.net/94952-progressform-mehrere-funktionen-parallel.html)

stephan007 28. Jun 2007 14:14


progressform, mehrere funktionen parallel
 
hallo!

ich habe meine progressform (oben task eintragen, unten den fortschritt des einzelnen tasks und den gesamtstand mit balken und anzeige sowie geschätzter zeit) soweit fertig. wenn ich eine der funktionalitäten (balken oder tasks eintragen) aufrufe, funktioniert es problemlos. wenn ich nun aber beide gleichzeitig haben will, also von meinem testform die jeweiligen funktionen nacheinander starten will, also zuerst die "task einfügen" mittels button click starte und dann die balken-simulation dazu starte, dann funktioniert immer nur das gerade zuletzt gewählte, also die letzte aktion gewinnt.

wie kann ich erreichen, dass z.b. das einfügen in die liste unbeirrt weiterarbeitet, auch wenn ich nun die balken-simulation starte? also dass beide parallel arbeiten.

muss ich da nun vor dem aufruf der jeweiligen aktion einen thread erzeugen und diesen nach der bearbeitung wieder beenden, oder wie genau kann ich dieses parallelität erreichen.

danke für eure hilfe.

stephan.

DeddyH 28. Jun 2007 14:16

Re: progressform, mehrere funktionen parallel
 
Zitat:

Zitat von stephan007
muss ich da nun vor dem aufruf der jeweiligen aktion einen thread erzeugen und diesen nach der bearbeitung wieder beenden, oder wie genau kann ich dieses parallelität erreichen.

Du hast Dir die Antwort selbst gegeben.

stephan007 28. Jun 2007 14:31

Re: progressform, mehrere funktionen parallel
 
das heißt also, ich muss folgendes machen:

(also pseudocode)
thread erzeugen
funktion aufrufen
thread killen

ok, dann weiß ich schon, was zu tun war.

danke fürs "auf die sprünge helfen", die narkose der op gestern blockiert heute scheinbar etwas. :lol:

stephan007 29. Jun 2007 09:35

Re: progressform, mehrere funktionen parallel
 
also irgendwie bekomme ich bei der obigen variante eine sonderbare fehlermeldung von delphi.

ich mache nichts anderes als im OnCreate ein mythread.Create(false) aufzurufen und im OnDestroy ein mythread.free;

das quitiert mir delphi aber mit der meldung "abstrakter fehler" beim start des programms.
was ist denn da wieder verkehrt? ich mach doch nichts anderes, als einen thread zu erzeugen und wieder freizugeben.

den thread habe ich im private teil der formclass definiert mit mythread: TThread.

hab ich da wo einen denkfehler drinnen oder wo könnte es sich hier spießen??

denn irgendwie will das mit den threads nicht so ganz wie ich will :roll:

stephan.

OregonGhost 29. Jun 2007 09:50

Re: progressform, mehrere funktionen parallel
 
Du musst nicht eine Variable vom Typ TThread erzeugen, sondern davon eine Klasse ableiten und diese dann instanziieren. Abstrakter Fehler heißt mehr oder weniger, dass versucht wurde, eine abstrakte Klasse zu instanziieren.

stephan007 29. Jun 2007 09:53

Re: progressform, mehrere funktionen parallel
 
äh sorry, ich versteh gerade nur bahnhof. kannst du mir das bitte an hand eines codefragments zeigen?

OregonGhost 29. Jun 2007 09:57

Re: progressform, mehrere funktionen parallel
 
Da meine Syntaxkenntnisse in Delphi etwas eingerostet sind, habe ich mal nach dem nächstbesten Beitrag über TThread gesucht und poste hier den Quellcode:
Delphi-Quellcode:
uses
  Classes;

type
  TMyThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  end;

implementation


procedure TMyThread.Execute;
begin
// Tue etwas
end;
In deinem Hauptformular kannst du dann zum Beispiel statt deiner Variablen vom Typ TThread eine vom Typ TMyThread erzeugen.

stephan007 29. Jun 2007 10:28

Re: progressform, mehrere funktionen parallel
 
ups, das wird ja aufwändiger als ich gedacht habe, vorallem welche aktion soll ich im execute haben?

ich will ja nur einen thread erzeugen und wieder löschen.

und das auch nur, damit ich in ein formular was einfügen kann und gleichzeitig die fortschrittsbalken anpassen kann. also dass zwei funktionen parallel laufen.

deshalb frage ich mich auch, welche funktionalität ich da im execute reinpacken soll, muss respektive kann. :roll:

ich glaube, ich mach mich mal auf die suche nach einem beispiel, in welchem threads verwendet werden und sowas ähnliches passiert, vielleicht wirds mir dann klarer.

Luckie 29. Jun 2007 10:31

Re: progressform, mehrere funktionen parallel
 
Guck mal hier: http://delphitutorials.michael-puff.de

DelphiManiac 29. Jun 2007 10:59

Re: progressform, mehrere funktionen parallel
 
Luckie hat Recht, guck dir mal sein (sehr gutes)
Tutorial zum Thema Threads an, dann wirst du auch die Zusammenhänge besser verstehen können.

Generell kann ich dir nur folgendes noch mit auf dem Weg geben:

- Du brauchst ja einen Thread, da du etwas parallel (ja ich weiss die wenigsten haben core duo, bzw 2 prozessoren), also
sagen wir mal Quasi-Parallel abarbeiten willst, dafür brauchst du einen Thread.
Wenn du von TThread ableitest musst du natürlich die virtuelle Execute() Methode überschreiben, da hier ja reinkommt, was der Thread dann machen soll, wenn er denn dann mal gestartet ist.

Weitere Themen, Synchronisation, Mutex..., das findest du alle bei Luckie super erklärt, also los gehts :)

stephan007 2. Jul 2007 09:55

Re: progressform, mehrere funktionen parallel
 
hm, nach durchsicht des tutorials frage ich mich irgendwie, ob der aufwand nicht viel zu viel ist für mein problem bzw. ich hab das problem, welche funktionalität packe ich in die execute??

hab nämlich zwei funktionen:
*) Progress (value: Integer);
*) AddMessage (aMessage: String);

diese werden mit ihren parametern jeweils aus einem beliebigen programm aufgerufen. d.h. ich weiß ja vorher nicht, welche der funktionen und vorallem mit welchen parametern ich aufrufen muss. daher kann ich das ja nicht in die execute des threads packen.
oder übersehe ich da was?

nach dem tipp eines kollegen bin ich gerade am überlegen, ob ich das ganze nicht mit messages lösen sollte.

mfg,
stephan.

stephan007 3. Jul 2007 13:30

Re: progressform, mehrere funktionen parallel
 
hat irgendwer vielleicht bitte mittlerweile eine idee, wie das funktionieren könnte? bin trotz tutorial nicht wirklich weitergekommen.

hab folgendes:

Delphi-Quellcode:
procedure TProgressForm.AddMessage(aMessage: String);
begin
  // add the message in here
end;

procedure TProgressForm.Progress(ProgressValue: Integer);
begin
  // do the changes
end;
und die werden von extern z.b. mit
Delphi-Quellcode:
ProgressForm.AddMessage('Test 1');
oder
Delphi-Quellcode:
ProgressForm.Progress(10);
aufgerufen.

nun habe ich ein testformular mit buttons. klicke ich button 1 werden 100 messages eingefügt (jeweils wenn der zufallsgenerator die gewünschte zeit erwischt, damit will ich beliebige zeitspannen simulieren). klicke ich auf einen zweiten button, so wird der progressbar um 1 erhöht, solange bis er auf maximum ist. das ganze soll nun quasi parallel passieren, weil ja theoretisch ein kommando kommen kann, wenn das eine noch arbeitet und das soll dann natürlich nicht abgebrochen werden (was ohne threads passiert).

wie muss ich den thread nun genau vorsehen (bin mit dem tutorial leider nur bedingt weitergekommen!), damit die quasi parallel ablaufen. wie man an obigen code sieht, kann ich die aktion nicht in den execute schieben, weil ich ja nicht weiß, welche der beiden aufgerufen wird.

vielleicht könnte mir wer bitte die notwendigen codezeilen posten, denn ich glaube, sonst sitze ich leider noch nächstes jahr da dran :roll:

denn ich glaube, wenn ichs in codeform sehe und daran austesten kann, könnte ich das auf dem weg leichter und schneller lernen und verstehen.

oder muss ich etwa im thread die funktionen definieren und von dort aufrufen? :gruebel:

stephan.

stephan007 3. Jul 2007 14:19

Re: progressform, mehrere funktionen parallel
 
-> gelöscht, da oberhalb ergänzt (besseres verständnis) <-


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 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