home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / gnu / aplusplus-1.01-src.lha / APlusPlus-1.01 / TESTPRGS / exec / TimedMsgPort_test.cxx < prev   
Encoding:
C/C++ Source or Header  |  1994-04-24  |  3.6 KB  |  142 lines

  1. /******************************************************************************
  2.  *
  3.  *    $Source: apphome:APlusPlus/RCS/TESTPRGS/exec/TimedMsgPort_test.cxx,v $
  4.  *
  5.  *    Demo for the A++ Library
  6.  *    Copyright (C) 1994 by Armin Vogt, EMail: armin@uni-paderborn.de
  7.  *
  8.  *       $Revision: 1.3 $
  9.  *       $Date: 1994/04/23 21:27:11 $
  10.  *       $Author: Armin_Vogt $
  11.  *
  12.  ******************************************************************************/
  13.  
  14.  
  15. //**  Creates two living objects of 'MyTask' class which both open a 'TimedMsgPort'
  16. //**  and send a message to each other.
  17.  
  18.  
  19.  
  20. #include <APlusPlus/exec/LvObject.h>
  21. #include <APlusPlus/exec/TimedMsgPort.h>
  22.  
  23.  
  24. volatile static char rcs_id[] = "$Id: TimedMsgPort_test.cxx,v 1.3 1994/04/23 21:27:11 Armin_Vogt Exp Armin_Vogt $";
  25.  
  26.  
  27. /**************************** MySRSP ***********************************/
  28. class MySRSP : public SignalResponder
  29. {
  30.    private:
  31.       BOOL running;
  32.    public:
  33.       MySRSP() : SignalResponder(SIGBREAKB_CTRL_C,0)
  34.       { running = TRUE; }
  35.       ~MySRSP() {}
  36.  
  37.       // overwrite the virtual 'signal received' action callback method.
  38.       void actionCallback()
  39.       {
  40.          cout << "**Break. You pressed CTRL-C.\n";
  41.          running = FALSE;
  42.       }
  43.  
  44.       BOOL hasNotOccured() { return running==TRUE; }
  45. };
  46.  
  47.  
  48. /**************************** MyMsgPort ***********************************/
  49. class TM : public MessageC
  50. {
  51.     private:
  52.         const UBYTE *textString;
  53.     public:
  54.         TM(const UBYTE *text) { textString = text; }
  55.         const UBYTE *string() { return textString; }
  56.             
  57. }; 
  58.             
  59. class MyMsgPort : public TimedMsgPort
  60. {
  61.     public:
  62.         MyMsgPort(const UBYTE *portName,BYTE portPri=0,UWORD sendWindowSize=1) 
  63.         : TimedMsgPort(portName,portPri,sendWindowSize) { }
  64.         ~MyMsgPort() {}
  65.                 
  66.         void processMsg(MessageC *msg)
  67.         {
  68.             cout << "msgport("<<(APTR)this << ") : received message '"<<((TM*)msg)->string()<<"'\n";
  69.         }
  70.         void processReply(MessageC *reply)
  71.         {
  72.             cout << "msgport("<<(APTR)this << ") : reply received\n";
  73.         }
  74. };
  75.  
  76.  
  77. /**************************** MyTask ***********************************/
  78. class MyTask : public LivingObject
  79. {
  80.     private:
  81.         const UBYTE *portName,*destination;
  82.     protected:
  83.         int main();
  84.     public:
  85.         MyTask(const UBYTE *myName,const UBYTE *destName) 
  86.         : portName(myName), destination(destName) { activate(); }
  87.         ~MyTask() {}
  88.             
  89. };
  90.  
  91. int MyTask::main()
  92. {
  93.     cout << "\tHello! I'm a living object running on a seperate task.\n" 
  94.           << "\tI'm now engaging my SignalResponder which will catch your CTRL-C break signal..\n";
  95.           
  96.     MySRSP ctrlCBreak;
  97.     MyMsgPort msgPort(portName);
  98.     
  99.     // create a message object of a class derived from MessageC
  100.     TM textMessage((UBYTE*)"This is a message text.");
  101.     
  102.     cout << "\tSending..\n";
  103.     msgPort.sendMsgToPort(textMessage,destination);
  104.     
  105.     cout << "\tWaiting..\n";
  106.     
  107.     while ( ctrlCBreak.hasNotOccured() )
  108.    {
  109.       SignalResponder::WaitSignal();    // dispatch next signal
  110.    }
  111.  
  112.    cout << "\tmsgport(" <<(APTR)this << ") says 'Goodbye'.\n\n";
  113.     return 0;
  114. }
  115.  
  116. main()
  117. {    
  118.     {
  119.     cout << "Welcome to TimedMsgPort_test!\n";
  120.     
  121.     cout << "Now I'm going to create a living object of 'MyTask' class..\n\n";    
  122.     
  123.     MyTask child1((UBYTE*)"child1",(UBYTE*)"child2"),    // create and start task that executes MyTask::main().
  124.              child2((UBYTE*)"child2",(UBYTE*)"child1");
  125.              
  126.     cout << "This is main: I'm setting up a CTRL-C break SignalResponder.\n"
  127.           << "Press CTRL-C to leave this demo.\n";
  128.           
  129.     MySRSP ctrlCBreak;    // create a signal responder that catches CTRL-C break signal.
  130.     
  131.     
  132.     while ( ctrlCBreak.hasNotOccured() )
  133.    {
  134.       SignalResponder::WaitSignal();    // wait for any signals
  135.    }
  136.     
  137.     cout << "I got your break signal. Thank You.\n";
  138.     cout << "Waiting for child process..\n";
  139.     }
  140.     cout << "Child process terminated. Goodbye.\nEND\n";
  141.     return 0;
  142. }