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

  1. /*--------------------------------------------------------------
  2.    BIGJOB3.C -- Peek Message approach to lengthy processing job
  3.  ---------------------------------------------------------------*/
  4.  
  5. #define INCL_WIN
  6.  
  7. #include <os2.h>
  8. #include <math.h>
  9. #include <stdio.h>
  10. #include "bigjob.h"
  11.  
  12. INT main (VOID)
  13.      {
  14.      static CHAR szClassName [] = "BigJob3" ;
  15.      HMQ         hmq ;
  16.      HWND        hwndFrame, hwndClient ;
  17.      QMSG        qmsg ;
  18.  
  19.      hab = WinInitialize (0) ;
  20.      hmq = WinCreateMsgQueue (hab, 0) ;
  21.  
  22.      WinRegisterClass (hab, szClassName, ClientWndProc,
  23.                             CS_SIZEREDRAW, 0, NULL) ;
  24.  
  25.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP,
  26.                     WS_VISIBLE | FS_SIZEBORDER | FS_TITLEBAR
  27.                                | FS_SYSMENU    | FS_MINMAX   | FS_MENU,
  28.                     szClassName, "BigJob Demo No. 3",
  29.                     0L, NULL, ID_RESOURCE, &hwndClient) ;
  30.  
  31.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  32.           WinDispatchMsg (hab, &qmsg) ;
  33.  
  34.      WinDestroyWindow (hwndFrame) ;
  35.      WinDestroyMsgQueue (hmq) ;
  36.      WinTerminate (hab) ;
  37.  
  38.      return 0 ;
  39.      }
  40.     
  41. ULONG EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, ULONG mp1,
  42.                                                      ULONG mp2)
  43.      {
  44.      static BOOL   bContinueCalc = FALSE ;
  45.      static SHORT  iStatus = STATUS_READY ;
  46.      static SHORT  iCalcRep, iCurrentRep = IDM_10 ;
  47.      static ULONG  lElapsedTime ;
  48.      double        A ;
  49.      SHORT         i ;
  50.      QMSG          qmsg ;
  51.  
  52.      switch (msg)
  53.           {
  54.           case WM_COMMAND:
  55.  
  56.                switch (LOUSHORT (mp1))
  57.                     {
  58.                     case IDM_10:
  59.                     case IDM_100:
  60.                     case IDM_1000:
  61.                     case IDM_10000:
  62.                          CheckMenuItem (hwnd, iCurrentRep, FALSE) ;
  63.                          iCurrentRep = LOUSHORT (mp1) ;
  64.                          CheckMenuItem (hwnd, iCurrentRep, TRUE) ;
  65.                          break ;
  66.  
  67.                     case IDM_START:
  68.                          EnableMenuItem (hwnd, IDM_START, FALSE) ;
  69.                          EnableMenuItem (hwnd, IDM_ABORT, TRUE) ;
  70.  
  71.                          iStatus = STATUS_WORKING ;
  72.                          WinInvalidateRect (hwnd, NULL) ;
  73.  
  74.                          iCalcRep = iCurrentRep ;
  75.                          bContinueCalc = TRUE ;
  76.                          lElapsedTime = WinGetCurrentTime (hab) ;
  77.  
  78.                          qmsg.msg = WM_NULL ;
  79.  
  80.                          for (A = 1.0, i = 0 ; i < iCalcRep ; i++)
  81.                               {
  82.                               A = Savage (A) ;
  83.  
  84.                               while (WinPeekMsg (hab, &qmsg, NULL, 0, 0,
  85.                                                   PM_NOREMOVE))
  86.                                    {
  87.                                    if (qmsg.msg == WM_QUIT)
  88.                                         break ;
  89.  
  90.                                    WinGetMsg (hab, &qmsg, NULL, 0, 0) ;
  91.                                    WinDispatchMsg (hab, &qmsg) ;
  92.  
  93.                                    if (!bContinueCalc)
  94.                                         break ;
  95.                                    }
  96.  
  97.                               if (!bContinueCalc || qmsg.msg == WM_QUIT)
  98.                                    break ;
  99.                               }
  100.                          lElapsedTime = WinGetCurrentTime (hab) - 
  101.                                                   lElapsedTime ;
  102.  
  103.                          if (!bContinueCalc || qmsg.msg == WM_QUIT)
  104.                               iStatus = STATUS_READY ;
  105.                          else
  106.                               iStatus = STATUS_DONE ;
  107.  
  108.                          WinInvalidateRect (hwnd, NULL) ;
  109.  
  110.                          EnableMenuItem (hwnd, IDM_START, TRUE) ;
  111.                          EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  112.                          break ;
  113.  
  114.                     case IDM_ABORT:
  115.                          bContinueCalc = FALSE ;
  116.                          break ;
  117.      
  118.                     default:
  119.                          break ;
  120.                     }
  121.                break ;
  122.  
  123.           case WM_PAINT:
  124.                PaintWindow (hwnd, iStatus, iCalcRep, lElapsedTime) ;
  125.                break ;
  126.  
  127.           default:
  128.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  129.           }
  130.      return 0L ;
  131.      }
  132.