Thread Terminal schliessen mit Perl (20 answers)
Opened by meier19 at 2009-03-21 15:44

meier19
 2009-03-22 08:50
#119674 #119674
User since
2009-02-03
73 Artikel
BenutzerIn
[Homepage] [default_avatar]
Darf ich die Diskussion noch etwas weiter führen?

Das bisherige Ergebnis lautet, dass mancher Benutzer eines Programms dieses auch mit dem Terminal will öffnen können. Dies ist möglich, und mein Programm arbeitet auch dann einwandfrei. Ein Problem ergibt sich jedoch, wenn der Anwender das Programm auch - anstatt durch "Beenden" in der grafischen Benutzeroberfläche - durch Schliessen des Terminals beendet, und davon muss ich wohl ausgehen, dass ein Anwender, der das Programm aus dem Terminal starten will, es auch durch Schliessen des Terminals will - korrekt - beenden können. Zwar beendet sich mein Programm auch in diesem Fall insofern, als es das Fenster der grafischen Anwendungsoberfläche schliesst. Aber ein Vorgang, den ich zum Beenden vorgesehen habe, wird beim Beenden durch Schliessen des Terminals nicht mehr ausgeführt.

Hier ein Beispiel, nach dem mit Beenden des Programms ein Piepston ausgegeben werden soll:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl
use strict;
use warnings;
use Tk;

my $mw = MainWindow -> new ();
$mw -> minsize (200, 200);
$mw -> OnDestroy (sub {print "\a"; $mw -> bell;});
$mw -> Button (-text => 'Beenden', -command => sub {exit;}) -> pack;
MainLoop;


Der Piepston wird ausgegeben, ob das Programm aus dem Terminal (print "\a") oder aus "Anwendung ausführen", also ohne Terminal ($mw -> bell), gestartet wurde. Soweit korrekt. Wenn das Programm aber durch Schliessen des Terminals beendet wird (also entsprechend aus dem Terminal gestartet worden war), so kann der Piepston nicht mehr ausgegeben werden, zum einen offenbar, weil der Terminal geschlossen ist, bevor der Piepston hätte ausgegeben werden können, und zum andern offenbar, weil der Ereignisbefehl "OnDestroy" aus Perl::Tk in diesem Fall nicht wirksam ist. Das Problem liesse sich lösen, wenn es zum Terminal einen Befehl gäbe, wonach ein Piepston auszugeben ist, wenn er geschlossen wird.

Der Grund weshalb ich zum Beenden des Programms etwas ausgeführt haben möchte, ist folgender (um auch allfällige Neugier zu befriedigen). Es soll vermieden werden, dass das Programm zweifach (oder mehrfach) gestartet wird, indem beim Starten des Programms ein Merker gesetzt - eine Datei erstellt - wird, so dass das Programm, wenn es nochmals gestartet werden will, "weiss", dass es bereits offen ist, und indem die Datei beim Beenden des Programms gelöscht wird, so dass das Programm sonst ohne weiteres gestartet werden kann. Vielleicht löst dies ein erfahrener Programmierer anders?

Welche Konsequenzen das mehrfache Starten meines Programms hätte, habe ich mir noch nicht überlegt - brauchte ich nicht, da das mehrfache Starten - vermeintlich - vermieden ist. Handelte es sich beispielsweise um ein Finanzbuchhaltungsprogramm (die Neugier, worum es sich bei meinem Programm handelt, ist damit nicht befriedigt), so könnte sich ergeben, dass in der einen Benutzeroberfläche ein Konto gelöscht wird, es in der andern Benutzeroberfläche aber noch vorhanden ist, so dass man dort eine Buchung über ein zuvor gelöschtes Konto eingeben könnte, was zu einem - nicht erwünschten - Fehler führen würde.
Der Mensch schöpft seine Gesetze nicht aus der Natur, sondern schreibt sie dieser vor (Immanuel Kant).

View full thread Terminal schliessen mit Perl