home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / msj / msjv3_2 / bigjob4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-02  |  4.7 KB  |  170 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.  
  32.      hab = WinInitialize (0) ;
  33.      hmq = WinCreateMsgQueue (hab, 0) ;
  34.  
  35.      WinRegisterClass (hab, szClassName, ClientWndProc,
  36.                             CS_SIZEREDRAW, 0, NULL) ;
  37.  
  38.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP,
  39.                     WS_VISIBLE | FS_SIZEBORDER | FS_TITLEBAR
  40.                                | FS_SYSMENU    | FS_MINMAX   | FS_MENU,
  41.                     szClassName, "BigJob Demo No. 4",
  42.                     0L, NULL, ID_RESOURCE, &hwndClient) ;
  43.  
  44.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  45.           WinDispatchMsg (hab, &qmsg) ;
  46.  
  47.      DosSuspendThread (idThread) ;
  48.  
  49.      WinDestroyWindow (hwndFrame) ;
  50.      WinDestroyMsgQueue (hmq) ;
  51.      WinTerminate (hab) ;
  52.  
  53.      return 0 ;
  54.      }
  55.     
  56. ULONG EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, ULONG mp1,
  57.                                                      ULONG mp2)
  58.      {
  59.      static SHORT iCurrentRep = IDM_10 ;
  60.      static SHORT iStatus = STATUS_READY ;
  61.      static ULONG lElapsedTime ;
  62.  
  63.      switch (msg)
  64.           {
  65.           case WM_CREATE:
  66.  
  67.                DosSemSet (&lSemTrigger) ;
  68.  
  69.                if (DosCreateThread (SecondThread, &idThread,
  70.                                     cThreadStack + sizeof cThreadStack))
  71.  
  72.                     WinAlarm (HWND_DESKTOP, WA_ERROR) ;
  73.  
  74.                break ;
  75.  
  76.           case WM_COMMAND:
  77.  
  78.                switch (LOUSHORT (mp1))
  79.                     {
  80.                     case IDM_10:
  81.                     case IDM_100:
  82.                     case IDM_1000:
  83.                     case IDM_10000:
  84.                          CheckMenuItem (hwnd, iCurrentRep, FALSE) ;
  85.                          iCurrentRep = LOUSHORT (mp1) ;
  86.                          CheckMenuItem (hwnd, iCurrentRep, TRUE) ;
  87.                          break ;
  88.  
  89.                     case IDM_START:
  90.                          iStatus = STATUS_WORKING ;
  91.                          WinInvalidateRect (hwnd, NULL) ;
  92.  
  93.                          iCalcRep = iCurrentRep ;
  94.                          bContinueCalc = TRUE ;
  95.                          DosSemClear (&lSemTrigger) ;
  96.           
  97.                          EnableMenuItem (hwnd, IDM_START, FALSE) ;
  98.                          EnableMenuItem (hwnd, IDM_ABORT, TRUE) ;
  99.                          break ;
  100.  
  101.                     case IDM_ABORT:
  102.                          bContinueCalc = FALSE ;
  103.  
  104.                          EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  105.                          break ;
  106.      
  107.                     default:
  108.                          break ;
  109.                     }
  110.                break ;
  111.  
  112.           case WM_CALC_DONE:
  113.  
  114.                iStatus = STATUS_DONE ;
  115.                lElapsedTime = mp1 ;
  116.                WinInvalidateRect (hwnd, NULL) ;
  117.  
  118.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  119.                EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  120.                break ;
  121.  
  122.           case WM_CALC_ABORTED:
  123.  
  124.                iStatus = STATUS_READY ;
  125.                WinInvalidateRect (hwnd, NULL) ;
  126.  
  127.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  128.                break ;
  129.  
  130.           case WM_PAINT:
  131.                PaintWindow (hwnd, iStatus, iCalcRep, lElapsedTime) ;
  132.                break ;
  133.  
  134.           default:
  135.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  136.           }
  137.      return 0L ;
  138.      }
  139.  
  140. VOID FAR SecondThread ()
  141.      {
  142.      double A ;
  143.      int    i ;
  144.      LONG   lTime ;
  145.      
  146.      while (1)
  147.           {
  148.           DosSemWait (&lSemTrigger, -1L) ;
  149.  
  150.           lTime = WinGetCurrentTime (hab) ;
  151.  
  152.           for (A = 1.0, i = 0 ; i < iCalcRep ; i++)
  153.                {
  154.                if (!bContinueCalc)
  155.                     break ;
  156.  
  157.                A = Savage (A) ;
  158.                }
  159.  
  160.           lTime = WinGetCurrentTime (hab) - lTime ;
  161.           
  162.           DosSemSet (&lSemTrigger) ;
  163.  
  164.           if (bContinueCalc)
  165.                WinPostMsg (hwndClient, WM_CALC_DONE, lTime, 0L) ;
  166.           else
  167.                WinPostMsg (hwndClient, WM_CALC_ABORTED, 0L, 0L) ;     
  168.           }
  169.      }
  170.