Da ich leider nichts darüber finden kann:
In meinem Programm habe ich eine Funktion, die eine Konsolenanwendung startet und den Output zurück gibt. Nun ist mir aufgefallen, dass ich den Prozess in gewissen Fällen auch unterbrechen können muss. Wenn ich jetzt nicht falsch denke, ist der Prozess ja nur innerhalb der Funktion verfügbar, so dass ich den ja nicht einfach so "manipulieren" kann. Ein weiterer Aufruf der Funktion würde ja einen neuen Prozess starten. Wie kriege ich das hin? Mein Gedanke war, die Variable in dem der Prozess initialisiert wird aus der Funktion heraus zu ziehen, damit ich jederzeit auf den Prozess zugreifen kann.. Oder gibt es da bessere Wege?
Prozess in einer Funktion beenden?
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Prozess in einer Funktion beenden?
Kaum. Die Prozess ID muss irgendwo gespeichert werden wo die Variable die Beendigung der Funktion überlebt und das ist in der Regel eine globale Variable. Was meinst du mit "Output zurück gibt"?Adromir hat geschrieben:Oder gibt es da bessere Wege?
Re: Prozess in einer Funktion beenden?
Danke für deine Antwort. Ich hatte vor so wenige renundanzen im Quelltext zu haben, wie nur möglich. Mir ist aber klar geworden, dass eine universelle Funktion so überladen werden würde, daß es dann auch keinen Unterschied machen würde, 3 sehr ähnliche Funktionen zu verwenden, zumal der Output je nach Anwendungsgebiet zwischen reinem Text und binärdaten Wechselt. Und da es eh sinnvoller ist, das in ein separates form zu packen, mach ich mir nicht die Mühe das irgendwie zu modifizieren
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Prozess in einer Funktion beenden?
Leider kann ich mir darunter nichts konkretes vorstellen, darum ist meine vorherige Antwort vielleicht nicht zutreffend.
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Prozess in einer Funktion beenden?
Funktion oder Methode?
Kurze Information, eine Methode ist eine Funktion eines Objektes:
Die Methdode gehört zu der Klasse TTestClass, und hat damit zugriff auf all ihre Felder (private variablen einer Klasse, werden mit FName bezeichnet) und damit können wir FCounter verwenden. Das bedeutet aber auch verschiedenene Klasseninstanzen werden verschiedene Counter haben.
Die Funktion gehört zu keiner Klasse und hat damit nur Zugriff auf die Globalen Variablen, z.B. GlobalCounter. Diese variable ist aber immer die selbe Variable unabhängig von wo/aus welchem Kontext man sie aufruft.
Da du mit Forms arbeitest, ist der Größte teil deines Projekts für gewöhnlich sowieso OOP (also spielt sich in Klassen ab), daher solltest du einfach ein TProcess feld zu der Klasse hinzufügen und darauf arbeiten. Globale Variablen sind für gewöhnlich nicht so schön, da es keine Zugriffskontrolle gibt.
Eine andere Lösung ist einfach den Process als parameter zu geben (um creation und destruction musst du dich dann außerhalb der Funktion kümmern):
Dann interresiert dich in der Funktion absolut nicht was drum herum abgeht. Z.B. im Funktionalen Programmieren, wo es keine Klassen oder Globalen Variablen gibt, wird das so eingesetzt und gibt die mit abstand sauberste Lösung (in dem sinne das all deine Funktionen keine Externen abbhängigkeiten haben und damit extrem viel einfacher zu warten sind)
Ich glaube aber in deinem Fall sind Klassen-Felder am einfachsten und besten
Kurze Information, eine Methode ist eine Funktion eines Objektes:
Code: Alles auswählen
type TTestClass = class
private
FCounter: Integer;
public
procedure TestMethode(...);
end;
...
var
GlobalCounter: Integer;
procedure TestFunction(...);
...
implementation
...
procedure TestFunction(...);
begin
Inc(GlobalCounter)
end;
procedure TTestClass.TestMethode(...);
begin
Inc(FCounter)
end;
Die Funktion gehört zu keiner Klasse und hat damit nur Zugriff auf die Globalen Variablen, z.B. GlobalCounter. Diese variable ist aber immer die selbe Variable unabhängig von wo/aus welchem Kontext man sie aufruft.
Da du mit Forms arbeitest, ist der Größte teil deines Projekts für gewöhnlich sowieso OOP (also spielt sich in Klassen ab), daher solltest du einfach ein TProcess feld zu der Klasse hinzufügen und darauf arbeiten. Globale Variablen sind für gewöhnlich nicht so schön, da es keine Zugriffskontrolle gibt.
Eine andere Lösung ist einfach den Process als parameter zu geben (um creation und destruction musst du dich dann außerhalb der Funktion kümmern):
Code: Alles auswählen
function StartTheProcess(const proc: TProcess);
begin
if Proc.Running then
Proc.Terminate;
...
end;
Ich glaube aber in deinem Fall sind Klassen-Felder am einfachsten und besten
Re: Prozess in einer Funktion beenden?
Anscheinend ist eine Klasse der beste Weg. Bin darauf nicht gekommen, da Klassen für mich noch recht neu sind.. Hab mich da irgendwie nicht so rangetraut, da ich das Konzept nicht verstanden hatte
Im Moment habe ich das Problem mit verschiedenen Funktionen gelöst.´, vielleicht werde ich das in Zukunft mal in eine Klasse gießen. Danke für eure Rückmeldung 

