MODULE IDCMPTask; (* ----------October 1988 by Paul Lukowicz---------- *) FROM Exec IMPORT Forbid, Permit, WaitPort, GetMsg, ReplyMsg; FROM ExecSupport IMPORT CreateTask, DeleteTask; FROM Graphics IMPORT DrawEllipse; FROM Intuition IMPORT IDCMPFlags, IDCMPFlagSet, IntuiMessagePtr, ModifyIDCMP, ActivateWindow; FROM RandomNumber IMPORT RND; FROM SYSTEM IMPORT ADR, ADDRESS; FROM Windows IMPORT OpenWindow, CloseWindow, WinGad, WinGadSet, WriteC, Window, Clear, SetColor; CONST TaskName = "BeipielTask"; (* Name des neuen Tasks *) VAR Task : ADDRESS; (* Zeiger auf den neuen Tasks *) Wind : Window; (* Zeiger auf das neue Fenster *) (* Compileroption: Stack nicht abbauen. *) (* $P- *) PROCEDURE NewTask (); (* Das ist der Code für den neuen Task. Diese Prozedur zeichnet in einer *) (* Endlosschleife Ellipsen mit zufälligen Radien. *) VAR x,y : INTEGER; BEGIN LOOP Forbid(); (* Taskswitching ausschalten *) x := 100 + RND(300); (* X-Koordinate der Ellipsenmitte *) y := 40 + RND(63); (* Y-Koordinate der Ellipsenmitte *) DrawEllipse(Wind^.rPort,x,y,RND(100),RND(35)); Permit() (* Taskswitching einschalten *) END; END NewTask; PROCEDURE ExMessage ( Wind : Window ); (* Diese Porozedur wartet auf eine Nachricht von Intuition und wertet sie *) (* aus. Dies wird wiederholt bis das close Gadget geclickt wird. *) VAR Message : IntuiMessagePtr; (* Zeiger auf die Intuitionnachricht *) MessageType : IDCMPFlagSet; (* Die Art der Nachricht *) color : INTEGER; BEGIN color := 0; MessageType := IDCMPFlagSet{ }; WITH Wind^ DO WHILE NOT (closeWindow IN MessageType) DO WaitPort(userPort); (* Auf Nachricht warten. *) Message := GetMsg(userPort); (* Nachricht lesen. *) MessageType := Message^.class; (* Art der Nachricht merken *) IF vanillaKey IN MessageType THEN (* Taste gedrückt ? *) Forbid (); (* Taskswitching ausschalten *) IF Message^.code = 76 THEN (* "L" gedrückt ? *) Clear(Wind) (* Ja -> Fenster löschen *) ELSIF Message^.code = 67 THEN (* "C" gedrückt ? *) color := (color + 1) MOD 3; (* Ja -> aktuelle Farbe ändern *) SetColor(Wind,color,0) (* und dem Fenster zuordnen *) END; Permit () (* Taskswitching einschalten *) END; ReplyMsg(Message) (* Nachricht beantworten *) END END END ExMessage; (* Das ist das Hauptprogramm, das den zweiten Task erzeugt. *) BEGIN (* Ein Fenster mit einem close-Gadget öffnen. *) OpenWindow(Wind,5,20,500,150,"TaskDemo",WinGadSet{closing}); (* Meldungen über Ereignisse in dem Fenster von Intution anfordern. *) ModifyIDCMP(Wind,IDCMPFlagSet{closeWindow,vanillaKey}); (* Das neue Fenster aktivieren *) ActivateWindow(Wind); (* Eineen neuen Task erzeugen und starten. *) Task := CreateTask(ADR(TaskName),-50,ADR(NewTask),30000); (* Intuition Nachrichten auswerten und auf close-Gadget warten *) ExMessage(Wind); Forbid(); (* Taskswitching verbieten *) DeleteTask(Task); (* Den anderen Task löschen *) Permit (); (* Taskswitching einschalten *) CloseWindow(Wind); (* Fenster schließen *) END IDCMPTask.