home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / BIGJOB.ZIP / BIGJOB4.C < prev    next >
C/C++ Source or Header  |  1989-03-27  |  5KB  |  172 lines

  1. /*---------------------------------------------------------------
  2.    BIGJOB4.C -- Second thread approach to lengthy processing job
  3.  ----------------------------------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_DOS
  7.  
  8. #include <os2.h>
  9. #include <math.h>
  10. #include <stdio.h>
  11. #include "bigjob.h"
  12.  
  13. #define WM_CALC_DONE     (WM_USER + 0)
  14. #define WM_CALC_ABORTED  (WM_USER + 1) 
  15.  
  16. VOID FAR SecondThread (VOID) ;
  17.  
  18. BOOL  bContinueCalc = FALSE ;
  19. HWND  hwndClient ;
  20. SHORT iCalcRep ;
  21. LONG  lSemTrigger ;
  22. TID   idThread ;
  23. UCHAR cThreadStack [4096] ;
  24.  
  25. INT main (VOID)
  26.      {
  27.      static CHAR szClassName [] = "BigJob4" ;
  28.      HMQ         hmq ;
  29.      HWND        hwndFrame ;
  30.      QMSG        qmsg ;
  31.      ULONG       flCreateFlags = FCF_SIZEBORDER|FCF_TITLEBAR|FCF_SYSMENU|
  32.                      FCF_MINMAX|FCF_MENU|FCF_SHELLPOSITION;
  33.  
  34.      hab = WinInitialize (NULL) ;
  35.      hmq = WinCreateMsgQueue (hab, 0) ;
  36.  
  37.      WinRegisterClass (hab, szClassName, ClientWndProc,
  38.                             CS_SIZEREDRAW, 0) ;
  39.  
  40.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP,
  41.                     WS_VISIBLE, &flCreateFlags,
  42.                     szClassName, "BigJob Demo No. 4",
  43.                     0L, NULL, ID_RESOURCE, &hwndClient) ;
  44.  
  45.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  46.           WinDispatchMsg (hab, &qmsg) ;
  47.  
  48.      DosSuspendThread (idThread) ;
  49.  
  50.      WinDestroyWindow (hwndFrame) ;
  51.      WinDestroyMsgQueue (hmq) ;
  52.      WinTerminate (hab) ;
  53.  
  54.      return 0 ;
  55.      }
  56.     
  57. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1,
  58.                                                      MPARAM mp2)
  59.      {
  60.      static SHORT iCurrentRep = IDM_10 ;
  61.      static SHORT iStatus = STATUS_READY ;
  62.      static ULONG lElapsedTime ;
  63.  
  64.      switch (msg)
  65.           {
  66.           case WM_CREATE:
  67.  
  68.                DosSemSet (&lSemTrigger) ;
  69.  
  70.                if (DosCreateThread (SecondThread, &idThread,
  71.                                     cThreadStack + sizeof cThreadStack))
  72.  
  73.                     WinAlarm (HWND_DESKTOP, WA_ERROR) ;
  74.  
  75.                break ;
  76.  
  77.           case WM_COMMAND:
  78.  
  79.                switch (LOUSHORT (mp1))
  80.                     {
  81.                     case IDM_10:
  82.                     case IDM_100:
  83.                     case IDM_1000:
  84.                     case IDM_10000:
  85.                          CheckMenuItem (hwnd, iCurrentRep, FALSE) ;
  86.                          iCurrentRep = LOUSHORT (mp1) ;
  87.                          CheckMenuItem (hwnd, iCurrentRep, TRUE) ;
  88.                          break ;
  89.  
  90.                     case IDM_START:
  91.                          iStatus = STATUS_WORKING ;
  92.                          WinInvalidateRect (hwnd, NULL, FALSE) ;
  93.  
  94.                          iCalcRep = iCurrentRep ;
  95.                          bContinueCalc = TRUE ;
  96.                          DosSemClear (&lSemTrigger) ;
  97.           
  98.                          EnableMenuItem (hwnd, IDM_START, FALSE) ;
  99.                          EnableMenuItem (hwnd, IDM_ABORT, TRUE) ;
  100.                          break ;
  101.  
  102.                     case IDM_ABORT:
  103.                          bContinueCalc = FALSE ;
  104.  
  105.                          EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  106.                          break ;
  107.      
  108.                     default:
  109.                          break ;
  110.                     }
  111.                break ;
  112.  
  113.           case WM_CALC_DONE:
  114.  
  115.                iStatus = STATUS_DONE ;
  116.                lElapsedTime = mp1 ;
  117.                WinInvalidateRect (hwnd, NULL, FALSE) ;
  118.  
  119.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  120.                EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  121.                break ;
  122.  
  123.           case WM_CALC_ABORTED:
  124.  
  125.                iStatus = STATUS_READY ;
  126.                WinInvalidateRect (hwnd, NULL, FALSE) ;
  127.  
  128.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  129.                break ;
  130.  
  131.           case WM_PAINT:
  132.                PaintWindow (hwnd, iStatus, iCalcRep, lElapsedTime) ;
  133.                break ;
  134.  
  135.           default:
  136.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  137.           }
  138.      return 0L ;
  139.      }
  140.  
  141. VOID FAR SecondThread ()
  142.      {
  143.      double A ;
  144.      int    i ;
  145.      LONG   lTime ;
  146.      
  147.      while (1)
  148.           {
  149.           DosSemWait (&lSemTrigger, -1L) ;
  150.  
  151.           lTime = WinGetCurrentTime (hab) ;
  152.  
  153.           for (A = 1.0, i = 0 ; i < iCalcRep ; i++)
  154.                {
  155.                if (!bContinueCalc)
  156.                     break ;
  157.  
  158.                A = Savage (A) ;
  159.                }
  160.  
  161.           lTime = WinGetCurrentTime (hab) - lTime ;
  162.           
  163.           DosSemSet (&lSemTrigger) ;
  164.  
  165.           if (bContinueCalc)
  166.                WinPostMsg (hwndClient, WM_CALC_DONE, lTime, 0L) ;
  167.           else
  168.                WinPostMsg (hwndClient, WM_CALC_ABORTED, 0L, 0L) ;     
  169.           }
  170.      }
  171.  
  172.