home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ool.zip / OOL / source / xthread.cpp < prev    next >
C/C++ Source or Header  |  1997-04-05  |  3KB  |  119 lines

  1. #include "xthread.h"
  2. #include "xmsgbox.h"
  3. #include "stdio.h"
  4. #include "xexcept.h"
  5.  
  6. #include <stdlib.h>
  7. #include <process.h>
  8.  
  9.  
  10. #ifndef __WATCOMC__
  11. int XThread::threadsRunning = 0;
  12. #else
  13. static int threadsRunning = 0;
  14. #endif
  15.  
  16.  
  17. ULONG XThread::Resume()
  18. {
  19.     return DosResumeThread(tid);
  20. }
  21.  
  22.  
  23. ULONG XThread::Suspend()
  24. {
  25.     return DosSuspendThread(tid);
  26. }
  27.  
  28.  
  29. /*@ XThread::Terminate(void)
  30. @group initiate/terminate a process
  31. @remarks With this method a thread can be terminated. If you
  32. call Terminate() the method QueryForQuit() will not be called.
  33. */
  34. void XThread::Terminate(void)
  35. {
  36.     XProcess::Terminate();
  37.     threadsRunning -= 1;
  38.     _endthread();
  39. }
  40.  
  41.  
  42. void XThread::ThreadEntry(void)
  43. {
  44.     hab = WinInitialize(0);
  45.     queue = WinCreateMsgQueue(hab, 0);
  46.     Init();
  47.     Start();
  48. }
  49.  
  50.  
  51. /*@ XThread::XThread(LONG)
  52. @group constructors/destructors
  53. @remarks Contructs a thread. After a thread is constructed, call Run() to make
  54. the thread work. You should override method XThread::Init() where you can construct
  55. windows and so on. Init() is the funcion where you enter the thread and have full controll of it.
  56. To stop the thread call Terminate().
  57. <BR>After you have called XThread::Run() for one or more threads,
  58. you must call XThread::RunThreads() to initialize this threads (only one time
  59. required).<P>
  60. <B>WARNING:</B> don∩t try to construct windows in the constructor of XThread or a derived
  61. class of it! 
  62. @parameters: LONG stackSize    size of the stack, default is 128000 KB
  63. */
  64.  
  65.  
  66. // TBO
  67. #ifndef __WATCOMC__
  68. void _Optlink StartUp(void *v)
  69. #else
  70. void StartUp(void *v)
  71. #endif
  72. {
  73.     XThread *t = (XThread *) v;
  74.  
  75.         // TBO
  76.         #ifndef __WATCOMC__
  77.     XThread :: threadsRunning++;
  78.         #else
  79.         threadsRunning++;
  80.         #endif
  81.     t->ThreadEntry();
  82.     delete t;
  83. }
  84.  
  85.  
  86. void XThread::Run()
  87. {
  88. #ifdef __BCPLUSPLUS__
  89.     tid = _beginthread(StartUp(this), stackSize, this);
  90. #else
  91.     tid = _beginthread(StartUp, 0, stackSize, (void *) this);
  92. #endif
  93. }
  94.  
  95.  
  96. /*@ XThread::RunThreads(void)
  97. @group initiate/terminate a process
  98. @remarks Call RunThreads if you have constructed one or more threads.
  99. Call RunTreads only one time.
  100. */
  101. void XThread::RunThreads(void)
  102. {
  103.     while (1)
  104.     {
  105.         TID id = 0;
  106.  
  107.         DosWaitThread(&id, DCWW_WAIT);
  108.                 // TBO
  109.                 #ifndef __WATCOMC__
  110.         if (XThread::threadsRunning <= 0)
  111.                 #else
  112.                 if( threadsRunning <= 0 )
  113.                 #endif
  114.             break;
  115.         DosSleep(0);
  116.     }
  117. }
  118.  
  119.