Maus, Menüs und Programmfehler machen keinem Programmierer Probleme, der mit Unterbrechungen richtig umgehen kann.
Unterbrechungen sind eine Besonderheit des Amiga-Basic. Damit ist nicht gemeint, daß der Amiga ein frecher Computer ist. Im Gegenteil. Was im Gespräch unhöflich und im Fernsehen ärgerlich ist, entpuppt sich hier als tolles Hilfsmittel, um elegante Programme zu schreiben. Sie erlauben Ihnen, auf Ereignisse zu reagieren, von denen Sie vorher nicht wissen, wann sie genau eintreten.
In dieser Folge des Amiga-Basic-Kurs dreht sich alles um Unterbrechungen, im Computer-Englisch »Interrupts« oder »Events« genannt. Unterbrechungen bei Computern haben die gleiche Wirkung wie eine Klingel. Wenn Sie in Ihrer Wohnung sitzen und gerade ein spannendes Buch lesen, wissen Sie nicht, ob und wann ein überraschender Besucher vor der Tür steht. Wenn er aber klingelt, wissen Sie, daß er da ist und gehen zur Tür.
Programme brauchen eine Klingel, damit sie auf besondere Ereignisse reagieren können. In der letzten Ausgabe haben wir uns mit Pull-Down-Menüs beschäfigt. Woher soll das Programm wissen, wann eine Funktion in einem Pull-Down-Menü angewählt wurde? Um das herauszufinden, muß es in einer Schleife abfragen, ob die Funktion »MENÜ (0)« einen anderen Wert als Null enthält. Das Programm verschwendet also wertvolle Zeit, um auf den Benutzer zu warten. Das ist so, als ob Sie nachts alle fünf Minuten auf Ihren Wecker sehen müßten, um nachzusehen, ob es Zeit zum Aufstehen ist.
Es ist wesentlich besser, eine Klingel im Programm zu installieren, die automatisch auf das Anwählen eines Menü-Punkts reagiert. Durch sie wird das Programm alarmiert, wenn sich der Benutzer entschieden hat. Es unterbricht dann seine momentane Arbeit, reagiert auf die Eingabe und macht an der Stelle weiter, an der es unterbrochen wurde. Genausowürden Sie handeln, wenn Sie ein Buch lesen und einen Anruf bekommen. Sie telefonieren und anschließend lesen Sie dort weiter, wo Sie aufgehört haben.
Eine »Klingel« im Amiga-Basic ist der Befehl »ON MENÜ GOSUB la-bel«. Sie kennen wahrscheinlich den Basic-Befehl »ON variable GOTO stellel,stelle2,stelle3 ...«. Er verzweigt je nach Wert der Variablen zu einer anderen Stelle im Programm. »ON MENÜ« arbeitet ähnlich. Sobald eine beliebige Funktion in einem Pull-Down-Menü angewählt . wurde, verzweigt das Programm zu dem Label, der hinter dem Befehl angegeben wurde. Die Unterbrechung wird wie ein Unterprogrammaufruf behandelt. Das gewährleistet, daß das Programm genau an der Stelle fortgesetzt wird, an der es gerade war, als der Menü-Aufruf stattfand. Der Programmteil, der die Funktion im Pull-Down-Menü ausführt, muß dann wie ein Unterprogramm mit Druck auf »RETURN« beendet werden.
Das Besondere an allen Unterbrechungen ist, daß Sie den »ON MENU«-Befehl nur einmal angeben müssen. Es genügt, ihn am Anfang des Programms zu stellen. Der Amiga springt immer zu dem Programmteil, der im letzten abgearbeiteten »ON MENU«-Befehl angegeben wurde.
Wichtig ist, daß Sie nicht nur das Sprungziel angeben. Nach dem Programmstart müssen Sie die entsprechende Unterbrechung erst erlauben. Dazu dient der Befehl »MENÜ ON«. Erst nach diesem Befehl erkennt das Programm, wenn Sie eine Funktion in einem Pull-Down-Menü anwählen. Sie müssen einmal den Befehl geben, um ein Ereignis so zu aktivieren, daß der Amiga es bemerkt. Wenn ein Programm Ihre Pull-Down-Menüs nicht beachtet, prüfen Sie, ob der »MENÜ ON«-Befehl fehlt. Sie dürfen aber keine Unterbrechung erlauben, bevor Sie nicht den Programmteil angegeben haben, zu dem das Programm verzweigen soll, wenn es eintritt. Wenn Sie also den »MENÜ ON«-Befehl vor dem »ON MENÜ GOSUB«-Komman-do geben, erhalten Sie eine Fehlermeldung.
Es ist schwer zu verstehen, daß ein Programm eine Zeile benutzt, die es im Augenblick gar nicht abarbeitet. Normalerweise reagiert es nur auf eine Bedingung, wenn sie in der aktuellen Programmzeile steht. Auf Unterbrechungen reagiert das Programm jedoch, sobald sie kommen, unabhängig davon, was es gerade macht. Sie müssen sich nur an den Gedanken gewöhnen, daß das Programm auf ein von Ihnen festgelegtes Ereignis selbsttätig reagiert. Es ist übrigens kein Multitasking, da immer nur ein Programmteil aktiv ist. Der andere ist kurzzeitig unterbrochen. Schließlich lesen Sie auch nicht weiter in Ihrem Buch, während Sie telefonieren.
Pull-Down-Menüs sind eines von sechs Ereignissen, die der Amiga verabeitet. Alle haben gemein, daß das Programm, sobald die Ereignisse auftreten, zu einem bestimmten Prpgrammteil verzweigen kann. Wie im richtigen Leben gibt es aber auch bei Programmen Momente, in denen es nicht gestört werden möchte. Das ist zum Beispiel der Fall, wenn es gerade Daten von der Diskette liest, auf Diskette speichert oder eine wichtige Berechnung durchführt. In solchen Fällen legen wir Menschen ein Kopfkissen über den Wecker oder hängen den Hörer des Telefons aus, um keine Anrufe zu erhalten. Für Ihr Programm müssen Sie das durch einen Basic-Befehl erledigen. Im Amiga-Basic ist das der Zusatz »OFF«. Mit dem Befehl »MENU OFF« reagiert das Programm nicht mehr auf die Pull-Down-Menüs, egal welche Funktion Sie anwählen.
Jegliche Unterbrechung durch die Menüs zu unterbinden, ist ein harter Weg, genau wie das Aushängen des Telefonhörers. Schließlich wissen Sie dann nicht, wer angerufen hat und ob es wichtig war. Für solche Fälle gibt es Anrufbeantworter, auf denen der Anrufer eine Nachricht hinterläßt. Das Amiga-Basic besitzt auch eine Art Anrufbeantworter, der Unterbrechungen so lange speichert, bis das Programm sie verarbeiten kann. Sein Kennzeichen ist die Endung »STOP« nach dem Befehl. Für die Menü-Abfrage heißt das Kommando also »MENÜ STOP«. Sie sollten es immer verwenden, wenn das Programm wichtige Funktionen ausführt, die nicht unterbrochen werden sollen.
Wie erfährt der Amiga, daß das Programm wieder Unterbrechungen akzeptiert? Das geschieht wiederum durch den Befehl »MENÜ ON«. Wenn es nach »MENÜ STOP« eine Unterbrechung gegeben hat, wird diese danach abgearbeitet, als sei das Ereignis gerade eben eingetreten. Doch Vorsicht! Wenn es während einer langen Pause mehrere Unterbrechungen gab, wird nur die letzte verwendet. Alle anderen ignoriert der Amiga.
Pull-Down-Menüs sind willkommene Unterbrechungen in Programmen. Schließlich wurden die Funktionen extra in den Menüs untergebracht, damit der Benutzer sie aufruft. Es gibt aber Unterbrechungen, die nicht so willkommen sind. Gemeint sind Programmabbrüche. Angenommen Sie haben eine Datei-Verwaltung geschrieben und in stundenlanger Arbeit Ihre ganze Plattensammlung eingegeben. Während Sie noch die letzten Beatles-Platten eintippen, kommt ein computerunerfahrener Freund zu Besuch. Als Sie kurz wegsehen, wählt er die Funktion < STOP > aus dem < RUN >-Menü, drückt < Amiga + . > oder < Control + o. Das Amiga-Basic meldet sich mit einem freundlichen »OK«, das Programm ist abgebrochen und alle Daten verloren.
Normalerweise sind Programmabbrüche auf Tastendruck sehr nützlich. In diesem Fall haben sie aber fatale Folgen, denn statt das Programm gleich zu beenden, hätte man lieber vorher die Daten speichern sollen. Zum Glück können Sie sich mit dem Amiga-Basic vor tolpatschigen Freunden schützen. Der richtige Befehl dazu heißt »ON BREAK GOSUB label«. Durch ihn weisen Sie das Basic an, Ihr Programm nicht mehr zu stoppen, sondern zu einem eigenen Programmteil zu springen.
Wie bei den Pull-Down-Menüs müssen Sie auch diese Unterbrechung erlauben. Hier heißt der Befehl »BREAK ON«. Wenn dieses Kommando fehlt, behandelt der Amiga die Unterbrechung als normalen Programmabbruch. Der Befehl »BREAK OFF« verbietet Programmabbrüche ganz, so daß dieses Ereignis vollkommen ausgeschaltet ist. Das Basic ignoriert die entsprechenden Tastendrücke des Benutzers. Dieses Verbot bedeutet, daß Sie sich darum nicht mehr kümmern brauchen. Doch denken Sie daran, daß Sie das Programm nicht mehr stoppen können, wenn es in einer Endlos-Schleife hängt.
Mit »BREAK STOP« bestimmen Sie wiederum, daß die Unterbrechung im Augenblick nicht beachtet wird. Eventuelle Tastendrücke werden auch hier gespeichert und abgearbeitet, sobald Sie Unterbrechungen wieder zulassen. Das geschieht durch den Befehl »BREAK ON«.
Zwei weitere Ereignisse arbeiten nach dem gleichen Prinzip: der Zusammenstoß von Objekten auf dem Bildschirm und die Mausabfrage. »ON MOUSE GOSUB label« unterbricht, sobald die linke Maus-Taste gedrückt wird. »ON COLLISION GOSUB label« macht sich bemerkbar, wenn sich zwei bewegliche Objekte (BOBs oder Sprites) auf dem Bildschirm berühren. Dieses Ereignis ist für Spiele wichtig. Wie bei allen Unterbrechungen müssen Sie daran denken, durch »MOUSE ON« und »COLLISION ON« die Ereignisse anzumelden, damit sie der Amiga registriert. Mit »MOUSE OFF« und »COLLISION OFF« verhindern Sie eine Unterbrechung vollkommen, während »MOUSE STOP« und »COLLISION STOP« das Eintreten eines Ereignisses nach dem nächsten »MOUSE ON« oder »COLLISION ON« melden. Das kennen Sie bereits von den anderen Befehlen.
Jetzt haben Sie vier Wege kennengelernt, um ein Programm zu unterbrechen. Drehen wir den Spieß doch mal um und lassen wir ein Programm uns unterbrechen. Mit dem Befehl »ON TIMER (Sekunden) GOSUB label« reagiert das Basic auf zeitabhängiges Ereignisse. Nach einer bestimmten Zeit springt es zu einem Programmteil, der Sie zum Beispiel in einem Denkspiel daran erinnert, nicht so lange zu überlegen.
Damit das Programm auf die interne Uhr reagieren kann, müssen Sie diese stellen. Schließlich gehen Sie ohne funktionierende Armbanduhr nicht zu einem Rendevous. Die Zeit legen Sie in Sekunden fest. Sobald die Zeit abgelaufen ist, springt das Basic in den von Ihnen festgelegten Programmteil. Mit ON TIMER (60) GOSUB ende lassen Sie dem Benutzer beispielsweise 60 Sekunden Zeit, bevor das Programm zum Label »ende« springt. 'Wie bei allen Unterbrechungen reagiert der Amiga nur, wenn Sie das Ereignis aktivieren. Erst nach dem Befehl »TIMER ON« beginnt die Uhr zu laufen.
Da die Uhr immer unbarmherzig weitertickt, kann es bei zeitkritischen Programmen zu Problemen kommen. Angenommen, Sie geben dem Spieler 30 Sekunden Zeit, den Weg aus einem Labyrinth zu finden. Wenn er den Ausgang kurz vor Ablauf der Frist findet, springt der Amiga nach exakt 30 Sekunden zur entsprechenden Unterroutine, obwohl der Spieler in der Zeit lag. Denken Sie in solchen Fällen daran, die Uhr durch »TIMER OFF« sofort abzustellen, wenn der Spieler den Ausgang gefunden hat. »TIMER STOP« unterbindet die Unterbrechung, bis zum nächsten »TIMER ON«-Befehl.
Eine Unterbrechung ganz besonderer Art sind Programmfehler. Bevor man sich versieht, hat man sich vertippt, teilt eine Zahl durch Null oder möchte eine Datei öffnen, die nicht auf der Diskette steht. Die Fehlermeldung und der Programmabbruch kann sehr ärgerlich sein, wenn man Daten noch nicht gespei-
Fortsetzung auf Seite 175
Event-Demo * von Gregor Neumann
Computertyp: Amiga
Sprache: Amiga-Basic
Eingabehilfe: keine
Kurzbeschreibung: Beispiel für Event-Programmierung
Blöcke auf Diskette: 3