home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / msj / msjv3_2 / bigjob5.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-02  |  6.5 KB  |  224 lines

  1. /*---------------------------------------------------------------
  2.    BIGJOB5.C -- Object window 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_OBJECT_CREATED     (WM_USER + 0)
  14. #define WM_START_CALC         (WM_USER + 1)
  15. #define WM_ABORT_CALC         (WM_USER + 2)
  16. #define WM_CALC_DONE          (WM_USER + 3)
  17. #define WM_CALC_ABORTED       (WM_USER + 4)
  18. #define WM_OBJECT_DESTROYED   (WM_USER + 5)
  19.  
  20. VOID  FAR SecondThread (VOID) ;
  21. ULONG EXPENTRY ObjectWndProc (HWND, USHORT, ULONG, ULONG) ;
  22.  
  23. HWND  hwndClient, hwndObject ;
  24. UCHAR cThreadStack [8192] ;
  25.  
  26. INT main (VOID)
  27.      {
  28.      static CHAR szClassName [] = "BigJob5" ;
  29.      HMQ         hmq ;
  30.      HWND        hwndFrame ;
  31.      QMSG        qmsg ;
  32.      TID         idThread ;
  33.  
  34.      hab = WinInitialize (0) ;
  35.      hmq = WinCreateMsgQueue (hab, 0) ;
  36.  
  37.      WinRegisterClass (hab, szClassName, ClientWndProc,
  38.                             CS_SIZEREDRAW, 0, NULL) ;
  39.  
  40.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP,
  41.                     WS_VISIBLE | FS_SIZEBORDER | FS_TITLEBAR
  42.                                | FS_SYSMENU    | FS_MINMAX   | FS_MENU,
  43.                     szClassName, "BigJob Demo No. 5",
  44.                     0L, NULL, ID_RESOURCE, &hwndClient) ;
  45.  
  46.      EnableMenuItem (hwndClient, IDM_START, FALSE) ;
  47.  
  48.      if (DosCreateThread (SecondThread, &idThread,
  49.                           cThreadStack + sizeof cThreadStack))
  50.  
  51.           WinAlarm (HWND_DESKTOP, WA_ERROR) ;
  52.  
  53.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  54.           WinDispatchMsg (hab, &qmsg) ;
  55.  
  56.      WinDestroyWindow (hwndFrame) ;
  57.      WinDestroyMsgQueue (hmq) ;
  58.      WinTerminate (hab) ;
  59.  
  60.      return 0 ;
  61.      }
  62.  
  63. ULONG EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, ULONG mp1,
  64.                                                      ULONG mp2)
  65.      {
  66.      static SHORT iCalcRep, iCurrentRep = IDM_10 ;
  67.      static SHORT iStatus = STATUS_READY ;
  68.      static ULONG lElapsedTime ;
  69.  
  70.      switch (msg)
  71.           {
  72.           case WM_OBJECT_CREATED:
  73.  
  74.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  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.                          EnableMenuItem (hwnd, IDM_START, FALSE) ;
  92.                          EnableMenuItem (hwnd, IDM_ABORT, TRUE) ;
  93.  
  94.                          iStatus = STATUS_WORKING ;
  95.                          WinInvalidateRect (hwnd, NULL) ;
  96.  
  97.                          iCalcRep = iCurrentRep ;
  98.                          WinPostMsg (hwndObject, WM_START_CALC,
  99.                                    MAKEULONG (iCalcRep, 0), 0L) ;
  100.                          break ;
  101.  
  102.                     case IDM_ABORT:
  103.                          WinPostMsg (hwndObject, WM_ABORT_CALC,
  104.                                                  0L, 0L) ;
  105.  
  106.                          EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  107.                          break ;
  108.      
  109.                     default:
  110.                          break ;
  111.                     }
  112.                break ;
  113.  
  114.           case WM_CALC_DONE:
  115.  
  116.                iStatus = STATUS_DONE ;
  117.                lElapsedTime = mp1 ;
  118.                WinInvalidateRect (hwnd, NULL) ;
  119.  
  120.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  121.                EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  122.                break ;
  123.  
  124.           case WM_CALC_ABORTED:
  125.  
  126.                iStatus = STATUS_READY ;
  127.                WinInvalidateRect (hwnd, NULL) ;
  128.  
  129.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  130.                break ;
  131.  
  132.           case WM_PAINT:
  133.  
  134.                PaintWindow (hwnd, iStatus, iCalcRep, lElapsedTime) ;
  135.                break ;
  136.  
  137.           case WM_CLOSE:
  138.  
  139.                if (hwndObject)
  140.                     WinPostMsg (hwndObject, WM_QUIT, 0L, 0L) ;
  141.                else
  142.                     WinPostMsg (hwnd, WM_QUIT, 0L, 0L) ;
  143.                break ;
  144.  
  145.           case WM_OBJECT_DESTROYED:
  146.  
  147.                WinPostMsg (hwnd, WM_QUIT, 0L, 0L) ;
  148.                break ;
  149.  
  150.           default:
  151.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  152.           }
  153.      return 0L ;
  154.      }
  155.  
  156. VOID FAR SecondThread ()
  157.      {
  158.      static CHAR szClassName [] = "BigJob5.Object" ;
  159.      HMQ         hmq ;
  160.      QMSG        qmsg ;
  161.  
  162.      hmq = WinCreateMsgQueue (hab, 0) ;
  163.  
  164.      WinRegisterClass (hab, szClassName, ObjectWndProc, 0L, 0, NULL) ;
  165.  
  166.      hwndObject = WinCreateWindow (HWND_OBJECT, szClassName,
  167.                     NULL, 0L, 0, 0, 0, 0, NULL, NULL, 0, NULL, NULL) ;
  168.  
  169.      WinPostMsg (hwndClient, WM_OBJECT_CREATED, 0L, 0L) ;
  170.  
  171.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  172.           WinDispatchMsg (hab, &qmsg) ;
  173.  
  174.      WinDestroyWindow (hwndObject) ;
  175.      WinDestroyMsgQueue (hmq) ;
  176.  
  177.      WinPostMsg (hwndClient, WM_OBJECT_DESTROYED, 0L, 0L) ;
  178.  
  179.      DosExit (0, 0) ;
  180.      }
  181.  
  182. ULONG EXPENTRY ObjectWndProc (HWND hwnd, USHORT msg, ULONG mp1,
  183.                                                      ULONG mp2)
  184.      {
  185.      double A ;
  186.      SHORT  i, iCalcRep ;
  187.      LONG   lQueueStatus, lTime ;
  188.  
  189.      switch (msg)
  190.           {
  191.           case WM_START_CALC:
  192.  
  193.                iCalcRep = LOUSHORT (mp1) ;
  194.                lTime = WinGetCurrentTime (hab) ;
  195.  
  196.                for (A = 1.0, i = 0 ; i < iCalcRep ; i++)
  197.                     {
  198.                     lQueueStatus = WinQueryQueueStatus (HWND_DESKTOP) ;
  199.  
  200.                     if (lQueueStatus & QS_POSTMSG)
  201.                          break ;
  202.  
  203.                     A = Savage (A) ;
  204.                     }
  205.  
  206.                if (lQueueStatus & QS_POSTMSG)
  207.                     break ;
  208.  
  209.                lTime = WinGetCurrentTime (hab) - lTime ;
  210.  
  211.                WinPostMsg (hwndClient, WM_CALC_DONE, lTime, 0L) ;
  212.                break ;
  213.  
  214.           case WM_ABORT_CALC:
  215.  
  216.                WinPostMsg (hwndClient, WM_CALC_ABORTED, 0L, 0L) ;
  217.                break ;
  218.  
  219.           default:
  220.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  221.           }
  222.      return 0L ;
  223.      }
  224.