home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / MTHREAD.PAK / MTHREAD.CPP < prev    next >
C/C++ Source or Header  |  1995-08-29  |  4KB  |  157 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1991, 1993 by Borland International
  3. //   A Multi-thread GDI demo program
  4. //----------------------------------------------------------------------------
  5. #include <owl\owlpch.h>
  6. #include <owl\applicat.h>
  7. #include <owl\mdi.h>
  8. #include <string.h>
  9. #include "demobase.h"
  10. #include "line.h"
  11. #include "arty.h"
  12.  
  13. // Menu bar constants
  14. const int MenuId            =  100;  // Resource Id of the menubar
  15. const int MoveToLineToDemoId=  201;  // Demo->MoveToDemo Id
  16. const int ArtyDemoId        =  202;  // Demo->Arty Demo Id
  17.  
  18. const int IconId            =  100;  // Resource Id of the program icon
  19.  
  20. //----------------------------------------------------------------------------
  21.  
  22. int
  23. TOWLThread::Synch()
  24. {
  25.   HANDLE Signals[2] = { HANDLE(*GetApplication()->GetMutex()), Done };
  26.   return ::WaitForMultipleObjects( 2, Signals, FALSE, -1 );
  27. }
  28.  
  29. HANDLE
  30. TBaseDemoWindow::Start()
  31. {
  32.   HANDLE Result = TThread::Start();
  33.   SetPriority( THREAD_PRIORITY_LOWEST );
  34.   return Result;
  35. }
  36.  
  37. unsigned long
  38. TBaseDemoWindow::Run()
  39. {
  40.   for(;;)
  41.     {
  42.     ::Sleep(20);
  43.     if( Synch() != 0 )
  44.         return 0;
  45.     else 
  46.       {
  47.       // This is a little tricky. On return from
  48.       // Synch() this thread owns a lock on the
  49.       // OWL synchronization object. In order to
  50.       // be exception-safe we must have an object
  51.       // whose destructor will release the lock.
  52.       // So we create one, which gives us two nested
  53.       // locks on the synchroniztion object. Then
  54.       // we release one of the locks. The destructor
  55.       // for the TAppLock object releases the other
  56.       // one at the end of this block.
  57.  
  58.       TApplication::TAppLock l(*GetApplication());
  59.       l.Release();
  60.  
  61.       // Call into the derived class for the actual processing
  62.       DoRun();
  63.       }
  64.     }
  65. }
  66.  
  67. TApplication *
  68. TBaseDemoWindow::GetApplication() const
  69. {
  70.   return TWindow::GetApplication();
  71. }
  72.  
  73. BOOL
  74. TBaseDemoWindow::CanClose()
  75. {
  76.   if( TerminateAndWait( 1000 ) == 0 )
  77.       return TRUE;
  78.   else
  79.       {
  80.       MessageBox( "Timeout while terminating thread", "gdidemo.exe" );
  81.       return FALSE;
  82.       }
  83. }
  84.  
  85. IMPLEMENT_CASTABLE1(TBaseDemoWindow, TWindow);
  86.  
  87. //----------------------------------------------------------------------------
  88.  
  89. class TGdiDemoWindow : public TMDIClient {
  90.   public:
  91.     TGdiDemoWindow() : TMDIClient() { Attr.Style |= WS_TABSTOP; }
  92.  
  93.   protected:
  94.     void CmMoveToLineToDemo();
  95.     void CmArtyDemo();
  96.  
  97.   DECLARE_RESPONSE_TABLE(TGdiDemoWindow);
  98. };
  99.  
  100. DEFINE_RESPONSE_TABLE1(TGdiDemoWindow, TMDIClient)
  101.   EV_COMMAND(MoveToLineToDemoId, CmMoveToLineToDemo),
  102.   EV_COMMAND(ArtyDemoId, CmArtyDemo),
  103. END_RESPONSE_TABLE;
  104.  
  105.  
  106. //
  107. // In response to a demo command, create one of the demo windows as the client
  108. // of an mdi child frame. Turn of the icon for the mdi child to allow the
  109. // client to paint itself when iconic.
  110. //
  111.  
  112. void
  113. TGdiDemoWindow::CmMoveToLineToDemo()
  114. {
  115.   TMDIChild* child = new TMDIChild(*this, "MoveTo/LineTo Window", 
  116.                                    new TMoveToLineToWindow);
  117.   child->SetIcon(0, 0);
  118.   child->Create();
  119. }
  120.  
  121. void
  122. TGdiDemoWindow::CmArtyDemo()
  123. {
  124.   TMDIChild* child = new TMDIChild(*this, "Arty Window", new TArtyWindow);
  125.   child->SetIcon(0, 0);
  126.   child->Create();
  127. }
  128.  
  129. //----------------------------------------------------------------------------
  130.  
  131. class TGdiDemoApp : public TApplication {
  132.   public:
  133.     TGdiDemoApp() : TApplication() {}
  134.     void InitMainWindow();
  135. };
  136.  
  137. void
  138. TGdiDemoApp::InitMainWindow()
  139. {
  140.   MainWindow = new TMDIFrame("Multi-Thread Demo", MenuId, *new TGdiDemoWindow);
  141.   MainWindow->SetIcon(this, IconId);
  142. }
  143.  
  144. int
  145. OwlMain(int /*argc*/, char* /*argv*/ [])
  146. {
  147. #if defined(__WIN32__)
  148.   if ((::GetVersion()&0x80000000) && (::GetVersion()&0xFF) < 4) {
  149.     ::MessageBox(0, "This Example requires a multithreaded version of Windows",
  150.                  "OWL Examples", MB_OK);
  151.     return 0;
  152.   }
  153. #endif
  154.   return TGdiDemoApp().Run();
  155. }
  156.  
  157.