home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / thrd1.zip / threads.cpp < prev    next >
Text File  |  1994-03-07  |  6KB  |  264 lines

  1. // Need following OS/2 include to get definition of WM_USER
  2. #define INCL_WINMESSAGEMGR
  3. extern "C"
  4.   {
  5.   #include <os2.h>
  6.   }
  7.  
  8. #include "threads.hpp"
  9.  
  10. main(int argc, char *argv[])
  11.  
  12.   {
  13.   IApplication::current().setArgs( argc, argv );
  14.   MyWindow myWindow;
  15.   IApplication::current().run();
  16.   }
  17.  
  18. MyOtherWindow :: MyOtherWindow( char* title, unsigned long windowId )
  19.   : IFrameWindow( title, windowId ),
  20.     myStaticText( ID_STATIC_TEXT, this, this )
  21.  
  22.   {
  23.   myStaticText.setText( "Hello World");
  24.   setClient( &myStaticText );
  25.   show();
  26.   }
  27.  
  28. Boolean My2ndThread :: user( IEvent &evt)
  29.   {
  30.   switch (evt.parameter1().number1() )
  31.     {
  32.     case ID_START_WINDOW_2:
  33.       {
  34.       if ( !my2ndWindow )
  35.         my2ndWindow = new MyOtherWindow("2nd Window", ID_WINDOW_2 );
  36.       break;
  37.       }
  38.     case ID_STOP_WINDOW_2:
  39.       {
  40.       if ( my2ndWindow )
  41.         {
  42.         my2ndWindow->close();
  43.         my2ndWindow = 0 ;
  44.         }
  45.       break;
  46.       }
  47.     case ID_START_WINDOW_3:
  48.       {
  49.       if ( !my3rdWindow )
  50.         my3rdWindow = new MyOtherWindow("3rd Window", ID_WINDOW_3 );
  51.       break;
  52.       }
  53.     case ID_STOP_WINDOW_3:
  54.       {
  55.       if ( my3rdWindow )
  56.         {
  57.         my3rdWindow->close();
  58.         my3rdWindow = 0;
  59.         }
  60.       break;
  61.       }
  62.     case ID_START_WINDOW_4:
  63.       {
  64.       if ( !my4thWindow )
  65.         my4thWindow = new MyOtherWindow("4th Window", ID_WINDOW_4 );
  66.       break;
  67.       }
  68.     case ID_STOP_WINDOW_4:
  69.       {
  70.       if ( my4thWindow )
  71.         {
  72.         my4thWindow->close();
  73.         my4thWindow = 0 ;
  74.         }
  75.       break;
  76.       }
  77.     case ID_START_WINDOW_5:
  78.       {
  79.       if ( !my5thWindow )
  80.         {
  81.         my5thWindow = new MyOtherWindow("5th Window", ID_WINDOW_5 );
  82.         }
  83.       break;
  84.       }
  85.     case ID_STOP_WINDOW_5:
  86.       {
  87.       if ( my5thWindow )
  88.         {
  89.         my5thWindow->close();
  90.         my5thWindow = 0;
  91.         }
  92.       break;
  93.       }
  94.     }
  95.  
  96.   // Write to a IStaticText owned by thread1
  97.   t1Static->setText(IString("Just handled id: ") + IString(evt.parameter1().number1()));
  98.   return true;
  99.   }
  100.  
  101. My2ndThread :: My2ndThread(IStaticText* static1 )
  102.   : my2ndWindow( 0 ),
  103.     my3rdWindow( 0 ),
  104.     my4thWindow( 0 ),
  105.     my5thWindow( 0 ),
  106.     myObjectWindow( 0 ),
  107.     t1Static(static1)
  108.  
  109.   { ; }
  110.  
  111. void My2ndThread :: run()
  112.  
  113.   {
  114.   myObjectWindow = new IObjectWindow( );
  115.   IWindowHandle objHandle= myObjectWindow->handle();
  116.   unsigned long whnd = objHandle;
  117.   IUserHandler::handleEventsFor( myObjectWindow );
  118.   IThread::current().processMsgs();
  119.   if (my2ndWindow) 
  120.     {
  121.     my2ndWindow->close();
  122.     my2ndWindow = 0;
  123.     }
  124.   if (my3rdWindow)
  125.     {
  126.     my3rdWindow->close();
  127.     my3rdWindow = 0;
  128.     }
  129.   if (my4thWindow)
  130.     {
  131.     my4thWindow->close();
  132.     my4thWindow = 0;
  133.     }
  134.   if (my5thWindow)
  135.     {
  136.     my5thWindow->close();
  137.     my5thWindow = 0;
  138.     }
  139.   IUserHandler::stopHandlingEventsFor( myObjectWindow );
  140.   }
  141.  
  142. My2ndThread :: ~My2ndThread()
  143.  
  144.   {
  145.   if (my2ndWindow)
  146.     my2ndWindow->close();
  147.   if (my3rdWindow)
  148.     my3rdWindow->close();
  149.   if (my4thWindow)
  150.     my4thWindow->close();
  151.   if (my5thWindow)
  152.     my5thWindow->close();
  153.   IUserHandler::stopHandlingEventsFor( myObjectWindow );
  154.   delete myObjectWindow;
  155.   if ( isStarted() )
  156.     IThread::current().stopProcessingMsgs();
  157.   }
  158.  
  159. MyWindow :: MyWindow( )
  160.   : IFrameWindow( "Main Window", ID_WINDOW_1 ),
  161.     myStaticText( ID_STATIC_TEXT, this, this ),
  162.     myMenuBar( ID_MAIN, this ),
  163.     my2ndThread(&myStaticText)
  164.  
  165.   {
  166.   myStaticText.setText( "Hello World");
  167.   setClient( &myStaticText );
  168.   ICommandHandler::handleEventsFor( this );
  169.   setFocus();
  170.   show();
  171.   }
  172.  
  173. MyWindow :: ~MyWindow( )
  174.  
  175.   {
  176.   ICommandHandler::stopHandlingEventsFor( this );
  177.   if ( my2ndThread.isStarted() ) 
  178.     {
  179.     my2ndThread.stopProcessingMsgs();
  180.     IThread::current().waitFor( my2ndThread );
  181.     }
  182.   }
  183.  
  184. Boolean MyWindow::command ( ICommandEvent &evt )
  185.  
  186.   {
  187.   Boolean brc = false;
  188.  
  189.   switch ( evt.commandId() )
  190.     {
  191.     case ID_START_THREAD :
  192.       {
  193.       my2ndThread.start( 
  194.         new IThreadMemberFn<My2ndThread>(my2ndThread,My2ndThread::run), true);
  195.       brc = true;
  196.       break;
  197.       }
  198.     case ID_STOP_THREAD :
  199.       {
  200.       my2ndThread.stopProcessingMsgs();
  201.       brc = true;
  202.       break;
  203.       }
  204.     case ID_START_WINDOW_2 :
  205.       {
  206.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  207.         IEventParameter1( ID_START_WINDOW_2, 0 ), IEventParameter2( 0 ) );
  208.       brc = true;
  209.       break;
  210.       }
  211.     case ID_STOP_WINDOW_2 :
  212.       {
  213.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  214.         IEventParameter1( ID_STOP_WINDOW_2, 0 ), IEventParameter2( 0 ) );
  215.       brc = true;
  216.       break;
  217.       }
  218.     case ID_START_WINDOW_3 :
  219.       {
  220.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  221.         IEventParameter1( ID_START_WINDOW_3, 0 ), IEventParameter2( 0 ) );
  222.       brc = true;
  223.       break;
  224.       }
  225.     case ID_STOP_WINDOW_3 :
  226.       {
  227.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  228.         IEventParameter1( ID_STOP_WINDOW_3, 0 ), IEventParameter2( 0 ) );
  229.       brc = true;
  230.       break;
  231.       }
  232.     case ID_START_WINDOW_4 :
  233.       {
  234.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  235.         IEventParameter1( ID_START_WINDOW_4, 0 ), IEventParameter2( 0 ) );
  236.       brc = true;
  237.       break;
  238.       }
  239.     case ID_STOP_WINDOW_4 :
  240.       {
  241.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  242.         IEventParameter1( ID_STOP_WINDOW_4, 0 ), IEventParameter2( 0 ) );
  243.       brc = true;
  244.       break;
  245.       }
  246.     case ID_START_WINDOW_5 :
  247.       {
  248.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  249.         IEventParameter1( ID_START_WINDOW_5, 0 ), IEventParameter2( 0 ) );
  250.       brc = true;
  251.       break;
  252.       }
  253.     case ID_STOP_WINDOW_5 :
  254.       {
  255.       my2ndThread.myObjectWindow->handle().postEvent( WM_USER,
  256.         IEventParameter1( ID_STOP_WINDOW_5, 0 ), IEventParameter2( 0 ) );
  257.       brc = true;
  258.       break;
  259.       }
  260.     }
  261.  
  262.   return brc;
  263.   }
  264.