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

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1991, 1993 by Borland International
  3. // Base window classes for the multi-thread GDI demo windows
  4. //----------------------------------------------------------------------------
  5. #ifndef __DEMOBASE_H
  6. #define __DEMOBASE_H
  7.  
  8. #include <owl\mdichild.h>
  9. #include <classlib\thread.h>
  10.  
  11. #define max(a,b)    (((a) > (b)) ? (a) : (b))
  12. #define min(a,b)    (((a) < (b)) ? (a) : (b))
  13.  
  14. //----------------------------------------------------------------------------
  15.  
  16. // class TOWLThread provides the fundamental control mechanism for
  17. // running data logging threads and synchronizing them with OWL
  18. // applications. It uses TThread for its basic thread management,
  19. // but uses a different mechanism for terminating threads, going
  20. // through an event semaphore rather than a simple flag. This is
  21. // needed so that the data logging thread can check both the event
  22. // semaphore and OWL's internal synchronization semaphore.
  23. // 
  24. // The data logging thread should call Synch() which will block
  25. // until the OWL synchronization semaphore is available or until
  26. // the event semaphore is triggered. If the thread was unblocked
  27. // by the event semaphore Synch() returns a non-zero value, and
  28. // the thread should exit. If the thread was unblocked by the
  29. // synchronization semaphore the thread owns a lock on that
  30. // semaphore.
  31.  
  32. class TOWLThread : public TThread
  33. {
  34.   public:
  35.     TOWLThread();
  36.     ~TOWLThread();
  37.  
  38.     void Terminate();
  39.     unsigned long WaitForExit( unsigned long timeout = NoLimit );
  40.     unsigned long TerminateAndWait( unsigned long timeout = NoLimit );
  41.  
  42.     virtual TApplication *GetApplication() const = 0;
  43.  
  44.   protected:
  45.  
  46.     int Synch();
  47.  
  48.   private:
  49.  
  50.     HANDLE Done;
  51. };
  52.  
  53. //----------------------------------------------------------------------------
  54.  
  55. inline TOWLThread::TOWLThread()
  56. {
  57.   Done = ::CreateEvent( 0, FALSE, FALSE, 0 );
  58. }
  59.  
  60. inline TOWLThread::~TOWLThread()
  61. {
  62.   ::CloseHandle(Done);
  63. }
  64.  
  65. inline void
  66. TOWLThread::Terminate()
  67. {
  68.   ::SetEvent(Done);
  69. }
  70.  
  71. inline unsigned long
  72. TOWLThread::WaitForExit( unsigned long timeout )
  73. {
  74.   return TThread::WaitForExit(timeout);
  75. }
  76.  
  77. inline unsigned long
  78. TOWLThread::TerminateAndWait( unsigned long timeout )
  79. {
  80.   Terminate();
  81.   return WaitForExit(timeout);
  82. }
  83.  
  84. //----------------------------------------------------------------------------
  85.  
  86. // class TBaseDemoWindow has been modified from the version in
  87. // the GDIDEMO example. It now has TOWLThread as a base class.
  88. // It overrides TOWLThread::Run() (which is pure virtual and
  89. // inherited from TThread) to implement a data logging loop
  90. // which calls TBaseDemoWindow::DoRun() periodically. Derived
  91. // classes should override DoRun() to perform their data
  92. // acquisition and logging.
  93.  
  94. // In this case, the modifications to the GDIDEMO example are
  95. // trivial: simply rename the TimerTick() function to DoRun().
  96. // The constructor for the derived class should call Start()
  97. // after the object has been fully constructed.
  98.  
  99. class TBaseDemoWindow : public TWindow, private TOWLThread {
  100.   public:
  101.     TBaseDemoWindow() : TWindow(0, 0, 0) {}
  102.  
  103.     virtual TApplication *GetApplication() const;
  104.  
  105.     BOOL CanClose();
  106.  
  107.     HANDLE Start();
  108.  
  109.   private:
  110.     unsigned long Run();
  111.     virtual void DoRun() = 0;
  112.  
  113.   DECLARE_CASTABLE;
  114. };
  115.  
  116. #endif
  117.