next up previous
Nächste Seite: DosSupport Aufwärts: Bibliotheksmoduln Vorherige Seite: DateConversions

Detach

Mit Hilfe des Moduls Detach kann das aktuelle Programm einfach von der Shell abgekoppelt werden. Dieses Modul arbeitet allerdings nur unter Kickstart Version 2.0.

Das Modul Detach ersetzt im Grunde einen Aufruf mittels

"run >outfile <infile prog"
wobei infile und outfile meist durch NIL: ersetzt werden. Diese Methode des Aufrufs hat jedoch den Nachteil, dass ein Programm sofort abgekoppelt ist. Oftmals sollen jedoch beim Starten anfallende Fehler- oder sonstige Meldungen noch ausgegeben werden. Man denke auch an den Syntax-Aufruf ,,prog ?``.

Genau dies ermöglicht Detach. Der Aufruf der Abkoppelungs-Prozedur erfolgt erst bei Bedarf und wenn ,,alles klar`` ist. Für den Einsatz müssen folgende Voraussetzungen erfüllt sein:

Die Prozedur Detach erzeugt einen neuen Prozess mit den angegebenen Parametern. Dabei ist name der Kommandoname, nicht der Name des Prozesses. Der Prozessname ist immer ,,Detached Process``. pri ist die Priorität im Bereich von -128 bis 127. Der Parameter stackSize ist die Grösse des Stacks in Byte, residentfähige Programme nehmen sich jedoch immer die beim Linken angegebene Stackgrösse! Die beiden FileHandles input und output müssen neu geöffnet sein, also keinesfalls Kopien von anderen Files. Sie werden automatisch vom System geschlossen. Sind beide identisch, wird nur einer geschlossen.

Zu beachten ist, dass beim Start von der Workbench das für Detach angegebene Fenster nicht geöffnet wird, sondern das über die Tooltypes angegebene, falls Terminal importiert wurde.

PROCEDURE DetachNorm(inname,outname:ARRAY OF CHAR);

Die Prozedur DetachNorm ist die einfachere Version von Detach und entspricht dem Aufruf

Detach(programName, ownPri, ownStackSize, in, out)
Ist outname eine leere Zeichenkette, wird der FileHandle des Parameters inname übernommen.


\begin{example}
Der Aufruf sieht typischerweise so aus:
\par\begin{verbatim}I...
...100/Test/CLOSE/AUTO'', '''');
Hauptprozedur();
END;\end{verbatim}\end{example}

Detach kehrt nur zurück, wenn das Programm von der Workbench oder als Hintergrundprozess gestartet wurde. Andernfalls, also durch normalen Shell-Start, wird das eigene Programm als Hintergrundprozess gestartet und der Urprozess durch Arts.Terminate beendet. Der neue Hintergrundprozess stellt nun bei seinem Aufruf von Detach fest, dass er kein Shell-Prozess ist und kehrt zur aufrufenden Prozedur zurück, die nun die eigentliche Arbeit des Programms beginnen kann.

Dies hört sich simpel an, musste aber wegen mangelhafter Dokumentation einiger Dos-Eigenschaften hart am Rande der Legalität programmiert werden. Insbesondere die Tatsache, dass ein Programm auch resident geladen werden kann machte das Modul relativ komplex.

Weil beide Prozesse einen Moment lang gleichzeitig auf der selben Segmentliste laufen, operieren sie auf identischen Variablen, was zum Absturz führen würde. Dies kann bei residentfähigen Programmen nicht passieren, da diese beim Start ihre eigenen Variablen anlegen.


next up previous
Nächste Seite: DosSupport Aufwärts: Bibliotheksmoduln Vorherige Seite: DateConversions
Claudio Nieder 2000-11-12