Ereignisse im Multi-Tasking-Betrieb

Die Ereignisfunktionen auf einen Blick:

▌evnt_button▌EVNT_BUT.C▌ Auf Maustastendruck warten.
▌evnt_dclick▌EVNT_DCL.C▌ Doppelklickintervall ermitteln oder ändern.
▌evnt_keybd▌EVNT_KEY.C▌  Auf Tastendruck warten.
▌evnt_mesag▌EVNT_MES.C▌  Auf Mitteilung warten.
▌evnt_mouse▌EVNT_MOU.C▌  Auf Mausbewegungen in ein Rechteck hinein (oder auch
            heraus) warten.
▌evnt_multi▌EVNT_MUL.C▌  Auf mehrere Ereignisse wie Maustastendruck,
            Mausbewegungen usw. gleichzeitig warten.
▌evnt_timer▌EVNT_TIM.C▌  Eine bestimmte Zeitspanne lang warten.

Alle Benutzereingaben werden unter GEM als Ereignisse aufgefa₧t.
Folgende Ereignisse können nun auftreten:

        ∙ Tastatureingaben
        ∙ Mausbewegungen
        ∙ Maustastendruck
        ∙ Zeitgeber Timeout
        ∙ Mitteilungen

Alle diese Ereignisse haben eine Gemeinsamkeit: Sie werden außerhalb
des betrachteten Programms erzeugt. Sie können deshalb nur durch
spezielle Vorkehrungen abgefangen werden.
Um Benutzeraktionen in einem Programm entgegenzunehmen, gibt es zwei
grundsätzliche Strategien: Polling und Interruptsteuerung. Polling be-
deutet, da₧ der Anwender von Zeit zu Zeit selbst nachfragen mu₧, ob
gerade ein bestimmtes Ereignis eingetreten ist. Mehrere Eingabegeräte
gleichzeitig per Polling abzufragen, ohne daß Benutzerereignisse ver-
loren gehen, ist eine sehr aufwendige Angelegenheit, die die meisten
Anwenderprogramme um ein Vielfaches komplizierter machen würde. GEM
bietet deshalb in Form von ▌evnt_multi▌EVNT_MUL.C▌ eine Funktion an, die im Stande
ist, mehrere Benutzerereignisse gleichzeitig abzufangen und zu verwal-
ten. Die interne Organisation dieser Funktion beruht natürlich auf
einem Interuptmechanismus, so daß Ereignisse nicht verloren gehen
können.
Die Funktion ▌evnt_multi▌EVNT_MUL.C▌ kann ganz spezifisch je nach den Anforderungen
des Anwenderprogramms auf bestimmte Ereignisse angesetzt werden. Wäh-
rend der Zeit, in der ▌evnt_multi▌EVNT_MUL.C▌ auf Ereignisse wartet, können andere
GEM-Programme im Hintergrund abgearbeitet werden. Die Ereignisverwal-
tung ist demnach sehr eng mit dem Multi-Tasking-Kernel verknüpft.
Das Multi-Tasking-Schema ist jedoch sehr einfach ausgelegt. Es können
lediglich bis zu fünf Tasks (sprich Aufgaben) gleichzeitig ablaufen:
Drei Accessory-Programme, eine Applikation und der Bildschirmmanager.
Die einzelnen Tasks werden der Reihe nach mit Hilfe eines Dispatchers
abgearbeitet. Ein Dispatcher ist ein Programm im Betriebssystem, das
vergleichbar ist mit einem Dirigenten in einem Orchester. Seine Auf-
gabe ist es den Mitspielern im richtigen Moment den Einsatz zu geben.
Jeder AES-Prozeß läuft nun dauernd durch die Schleife des Dispatchers.
Wenn die Applikation noch auf ein Ereignis wartet, wird sie in die
Reihe der noch nicht fertigen Prozesse gelegt. Tritt das Ereignis ein,
dann kommt der Prozeß in die Warteschlange der fertigen Prozesse und
muß dort solange auf die Weiterverarbeitung warten, bis die bereits
wartenden Prozesse vor ihm abgearbeitet wurden. Schließlich wird das
Programm abgearbeitet und nach einem Aufruf einer evnt-Funktion wieder
in die Reihe der noch nicht fertigen Prozesse eingereiht. Falls das
Programm jedoch auf kein Ereignis warten muß, kann es sich direkt an
der Schlange der fertigen Prozesse anstellen.
Die Umschaltung von einer Task auf die andere kann nur während des
Aufrufs von AES-Funktionen erfolgen. Ein Programm, das über weite
Strecken lediglich VDI-Fumktionen oder Betriebssystem-Funktionen
verwendet, läuft demnach Gefahr, andere Applikationen völlig abzu-
hängen.
Dem Bildschirmmanager kommt als eigenständige Task eine sehr wichtige
Aufgabe zu: Er verwaltet alle Mausbewegungen im Zusammenhang mit
selektierbaren Bildschirmbereichen, wie zum Beispiel den Menüs. Wird
zum Beispiel ein Menüpunkt ausgewählt, dann sendet der Bildschirmmana-
ger eine Mitteilung über dieses Ereignis an das Anwenderprogramm.
Alle Ereignisse, die von ▌evnt_multi▌EVNT_MUL.C▌ auf einmal abgefangen werden
können, lassen sich auch einzeln ermitteln. ▌evnt_keybd▌EVNT_KEY.C▌ nimmt alle
Tastatur-Eingaben entgegen. ▌evnt_button▌EVNT_BUT.C▌ ist für die Maustasten zu-
ständig. Die Geschwindigkeit bei Doppelklicks kann mit ▌evnt_dclick▌EVNT_DCL.C▌
anwendungsspezifisch eingestellt werden. Mit ▌evnt_mouse▌EVNT_MOU.C▌ werden die
Bewegungen der Maus überwacht. Mitteilungen werden über die Funktion
▌evnt_mesag▌EVNT_MES.C▌ analysiert. Die Funktion ▌evnt_timer▌EVNT_TIM.C▌ legt eine Time-
out-Periode fest. Während die letztgenannten Einzelfunktionen nur in
Spezialsituationen zum Einsatz kommen, stellt ▌evnt_multi▌EVNT_MUL.C▌ das Kern-
stück eines jeden GEM-Programms dar. Nach den Initialisierungen
von Bildschirm, Menüs und Resource-Set bewegt man sich normalerweise
in einer Endlosschleife, die nur bei schweren Fehlern oder der Option
Quit verlassen wird.
