![]() |
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. |
Re: progressform, mehrere funktionen parallel
Zitat:
|
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: |
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. |
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.
|
Re: progressform, mehrere funktionen parallel
äh sorry, ich versteh gerade nur bahnhof. kannst du mir das bitte an hand eines codefragments zeigen?
|
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:
In deinem Hauptformular kannst du dann zum Beispiel statt deiner Variablen vom Typ TThread eine vom Typ TMyThread erzeugen.
uses
Classes; type TMyThread = class(TThread) private { Private-Deklarationen } protected procedure Execute; override; end; implementation procedure TMyThread.Execute; begin // Tue etwas end; |
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. |
Re: progressform, mehrere funktionen parallel
Guck mal hier:
![]() |
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 :) |
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. |
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:
und die werden von extern z.b. mit
procedure TProgressForm.AddMessage(aMessage: String);
begin // add the message in here end; procedure TProgressForm.Progress(ProgressValue: Integer); begin // do the changes end;
Delphi-Quellcode:
oder
ProgressForm.AddMessage('Test 1');
Delphi-Quellcode:
aufgerufen.
ProgressForm.Progress(10);
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. |
Re: progressform, mehrere funktionen parallel
-> gelöscht, da oberhalb ergänzt (besseres verständnis) <-
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 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