Prozess in einer Funktion beenden?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Prozess in einer Funktion beenden?

Beitrag von Adromir »

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?

mse
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?

Beitrag von mse »

Adromir hat geschrieben:Oder gibt es da bessere Wege?

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
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Re: Prozess in einer Funktion beenden?

Beitrag von Adromir »

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

mse
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?

Beitrag von mse »

Leider kann ich mir darunter nichts konkretes vorstellen, darum ist meine vorherige Antwort vielleicht nicht zutreffend.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Prozess in einer Funktion beenden?

Beitrag von Warf »

Funktion oder Methode?
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 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):

Code: Alles auswählen

function StartTheProcess(const proc: TProcess);
begin
  if Proc.Running then
    Proc.Terminate;
  ...
end;

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

Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Re: Prozess in einer Funktion beenden?

Beitrag von Adromir »

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 :P 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 :)

Antworten