home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / os2 / bigjob / bigjob3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-27  |  4.5 KB  |  133 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.      ULONG       flCreateFlags = FCF_SIZEBORDER|FCF_TITLEBAR|FCF_SYSMENU|
  19.                      FCF_MINMAX|FCF_MENU|FCF_SHELLPOSITION;
  20.  
  21.      hab = WinInitialize (NULL) ;
  22.      hmq = WinCreateMsgQueue (hab, 0) ;
  23.  
  24.      WinRegisterClass (hab, szClassName, ClientWndProc,
  25.                             CS_SIZEREDRAW, 0) ;
  26.  
  27.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP,
  28.                     WS_VISIBLE, &flCreateFlags,
  29.                     szClassName, "BigJob Demo No. 3",
  30.                     0L, NULL, ID_RESOURCE, &hwndClient) ;
  31.  
  32.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  33.           WinDispatchMsg (hab, &qmsg) ;
  34.  
  35.      WinDestroyWindow (hwndFrame) ;
  36.      WinDestroyMsgQueue (hmq) ;
  37.      WinTerminate (hab) ;
  38.  
  39.      return 0 ;
  40.      }
  41.     
  42. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1,
  43.                                                      MPARAM mp2)
  44.      {
  45.      static BOOL   bContinueCalc = FALSE ;
  46.      static SHORT  iStatus = STATUS_READY ;
  47.      static SHORT  iCalcRep, iCurrentRep = IDM_10 ;
  48.      static ULONG  lElapsedTime ;
  49.      double        A ;
  50.      SHORT         i ;
  51.      QMSG          qmsg ;
  52.  
  53.      switch (msg)
  54.           {
  55.           case WM_COMMAND:
  56.  
  57.                switch (LOUSHORT (mp1))
  58.                     {
  59.                     case IDM_10:
  60.                     case IDM_100:
  61.                     case IDM_1000:
  62.                     case IDM_10000:
  63.                          CheckMenuItem (hwnd, iCurrentRep, FALSE) ;
  64.                          iCurrentRep = LOUSHORT (mp1) ;
  65.                          CheckMenuItem (hwnd, iCurrentRep, TRUE) ;
  66.                          break ;
  67.  
  68.                     case IDM_START:
  69.                          EnableMenuItem (hwnd, IDM_START, FALSE) ;
  70.                          EnableMenuItem (hwnd, IDM_ABORT, TRUE) ;
  71.  
  72.                          iStatus = STATUS_WORKING ;
  73.                          WinInvalidateRect (hwnd, NULL, FALSE) ;
  74.  
  75.                          iCalcRep = iCurrentRep ;
  76.                          bContinueCalc = TRUE ;
  77.                          lElapsedTime = WinGetCurrentTime (hab) ;
  78.  
  79.                          qmsg.msg = WM_NULL ;
  80.  
  81.                          for (A = 1.0, i = 0 ; i < iCalcRep ; i++)
  82.                               {
  83.                               A = Savage (A) ;
  84.  
  85.                               while (WinPeekMsg (hab, &qmsg, NULL, 0, 0,
  86.                                                   PM_NOREMOVE))
  87.                                    {
  88.                                    if (qmsg.msg == WM_QUIT)
  89.                                         break ;
  90.  
  91.                                    WinGetMsg (hab, &qmsg, NULL, 0, 0) ;
  92.                                    WinDispatchMsg (hab, &qmsg) ;
  93.  
  94.                                    if (!bContinueCalc)
  95.                                         break ;
  96.                                    }
  97.  
  98.                               if (!bContinueCalc || qmsg.msg == WM_QUIT)
  99.                                    break ;
  100.                               }
  101.                          lElapsedTime = WinGetCurrentTime (hab) - 
  102.                                                   lElapsedTime ;
  103.  
  104.                          if (!bContinueCalc || qmsg.msg == WM_QUIT)
  105.                               iStatus = STATUS_READY ;
  106.                          else
  107.                               iStatus = STATUS_DONE ;
  108.  
  109.                          WinInvalidateRect (hwnd, NULL, FALSE) ;
  110.  
  111.                          EnableMenuItem (hwnd, IDM_START, TRUE) ;
  112.                          EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  113.                          break ;
  114.  
  115.                     case IDM_ABORT:
  116.                          bContinueCalc = FALSE ;
  117.                          break ;
  118.      
  119.                     default:
  120.                          break ;
  121.                     }
  122.                break ;
  123.  
  124.           case WM_PAINT:
  125.                PaintWindow (hwnd, iStatus, iCalcRep, lElapsedTime) ;
  126.                break ;
  127.  
  128.           default:
  129.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  130.           }
  131.      return 0L ;
  132.      }
  133.