home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / multtsk / cpmult / demo / piepser.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-04-07  |  3.1 KB  |  124 lines

  1. PROGRAM Piepser;
  2.  
  3. {$R-,S-,I-,D-,F-,V-,B-,N-,L- }
  4. {
  5.  
  6.   Christian Philipps Software-Technik
  7.   Düsseldorfer Str. 316
  8.   4130 Moers 1
  9.  
  10.   November 1988
  11.   Stand: 1/89
  12. }
  13.  
  14. USES Crt, CpMulti;
  15.  
  16. CONST NoTsk  = 5;
  17.  
  18. VAR   Sem      : Pointer;   { Koordiniation der Startphase }
  19.       SoundSem : Pointer;   { Koordination des Sound()-Zugriffs }
  20.       TaskNo   : Word;
  21.       c        : Char;
  22.  
  23. {---------------------------------------------------------------------------}
  24.  
  25. {$F+}
  26. PROCEDURE PiepsTask(P:Pointer);
  27.  
  28. { Diese Task wird im Code-Sharing gefahren und erzeugt alle 3 Sekunden
  29.   einen Piepston }
  30.  
  31. VAR  MyNo : Word;
  32.  
  33. BEGIN {PiepsTask}
  34.   MyNo := TaskNo;        { Hole Nummer aus glob. Variable }
  35.   Writeln('Task Nr. ',MyNo,' ist jetzt aktiv!');
  36.   SemSignal(Sem);        { laß Hauptprogramm weiterlaufen }
  37.   REPEAT                 { Taskrumpf }
  38.     Sleep(Seconds(3));
  39.     SemWait(SoundSem);   { Anfordern des Sound-Generators }
  40.     Sound(MyNo * 300);
  41.     Delay(50);
  42.     NoSound;
  43.     SemSignal(SoundSem); { Freigeben des Sound-Generators }
  44.   UNTIL False;
  45. END;  {PiepsTask}
  46.  
  47. {---------------------------------------------------------------------------}
  48.  
  49. PROCEDURE BrummTask(P:Pointer);
  50.  
  51. { Diese Task brummt alle 6 Sekunden für 1/2 Sekunde }
  52.  
  53. BEGIN {BrummTask}
  54.   REPEAT
  55.     Sleep(Seconds(6));
  56.     SemWait(SoundSem);
  57.     Sound(300);
  58.     Delay(500);
  59.     NoSound;
  60.     SemSignal(SoundSem);
  61.   UNTIL False;
  62. END;  {BrummTask}
  63. {$F-}
  64.  
  65. {---------------------------------------------------------------------------}
  66.  
  67. BEGIN {Main}
  68.   ClrScr;
  69.   Writeln('Dieses Programm erzeugt 5 Tasks, die alle 3 Sekunden einen Piepston');
  70.   Writeln('unterschiedlicher Höhe erzeugen sowie eine Taks, die alle 6 Sekunden');
  71.   Writeln('eine halbe Sekunde lang piepst.');
  72.   Writeln('Die Sound-Tasks haben höhere Priorität als das Hauptprogramm!');
  73.   Writeln;
  74.   Writeln('Das Hauptprogramm verbringt seine Zeit damit, auf eine Eingabe zu warten,');
  75.   Writeln('bis die Anwendung durch Eingabe von ESC beendet wird!');
  76.   Writeln;
  77.  
  78.   { Erzeugen der Semaphoren }
  79.   IF (CreateSem(Sem) <> Sem_OK)    OR
  80.      (CreateSem(SoundSem) <> Sem_Ok)
  81.      THEN BEGIN
  82.             Writeln('Fehler beim Erzeugen einer Semaphore!');
  83.             Halt(1);
  84.           END;
  85.  
  86.   { Erzeugen der Pieps-Tasks }
  87.   FOR TaskNo := 1 TO NoTsk DO
  88.   BEGIN
  89.     SemClear(Sem);
  90.     IF CreateTask(PiepsTask,NIL,Pri_Kernel,300) < 0
  91.        THEN BEGIN
  92.               Writeln(^G'Fehler beim Erzeugen der Task ',TaskNo);
  93.               Halt(1);
  94.             END;
  95.     SemWait(Sem);
  96.   END;
  97.  
  98.   { Erzeugen der Brumm-Task }
  99.   IF CreateTask(BrummTask,NIL,Pri_Kernel,300) < 0
  100.      THEN BEGIN
  101.             Writeln(^G'Fehler beim Erzeugen der Slow-Task ');
  102.             Halt(1);
  103.           END;
  104.  
  105.   GotoXY(20,15);
  106.   Writeln('---------------------------------------');
  107.   Window(1,16,80,25);
  108.  
  109.   { Hauptprogramm - Verarbeitung }
  110.   REPEAT
  111.     IF KeyPressed
  112.        THEN BEGIN
  113.               c := ReadKey;
  114.               Write(c);
  115.               IF c=#13
  116.                  THEN Writeln;
  117.             END;
  118.   UNTIL c=#27;
  119.  
  120.   SemWait(SoundSem);    { Verhindere weitere Tonerzeugung }
  121.   Window(1,1,80,25);
  122.   GotoXY(1,23);
  123. END.
  124.