home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / BIGJOB.ZIP / BIGJOB5.C < prev    next >
C/C++ Source or Header  |  1989-03-27  |  7KB  |  225 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. MRESULT EXPENTRY ObjectWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  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.      ULONG       flCreateFlags = FCF_SIZEBORDER|FCF_TITLEBAR|FCF_SYSMENU|
  34.                      FCF_MINMAX|FCF_MENU|FCF_SHELLPOSITION;
  35.  
  36.      hab = WinInitialize (NULL) ;
  37.      hmq = WinCreateMsgQueue (hab, 0) ;
  38.  
  39.      WinRegisterClass (hab, szClassName, ClientWndProc,
  40.                             CS_SIZEREDRAW, 0) ;
  41.  
  42.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP,
  43.                     WS_VISIBLE, &flCreateFlags,
  44.                     szClassName, "BigJob Demo No. 5",
  45.                     0L, NULL, ID_RESOURCE, &hwndClient) ;
  46.  
  47.      EnableMenuItem (hwndClient, IDM_START, FALSE) ;
  48.  
  49.      if (DosCreateThread (SecondThread, &idThread,
  50.                           cThreadStack + sizeof cThreadStack))
  51.  
  52.           WinAlarm (HWND_DESKTOP, WA_ERROR) ;
  53.  
  54.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  55.           WinDispatchMsg (hab, &qmsg) ;
  56.  
  57.      WinDestroyWindow (hwndFrame) ;
  58.      WinDestroyMsgQueue (hmq) ;
  59.      WinTerminate (hab) ;
  60.  
  61.      return 0 ;
  62.      }
  63.  
  64. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1,
  65.                                                      MPARAM mp2)
  66.      {
  67.      static SHORT iCalcRep, iCurrentRep = IDM_10 ;
  68.      static SHORT iStatus = STATUS_READY ;
  69.      static ULONG lElapsedTime ;
  70.  
  71.      switch (msg)
  72.           {
  73.           case WM_OBJECT_CREATED:
  74.  
  75.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  76.                break ;
  77.  
  78.           case WM_COMMAND:
  79.  
  80.                switch (LOUSHORT (mp1))
  81.                     {
  82.                     case IDM_10:
  83.                     case IDM_100:
  84.                     case IDM_1000:
  85.                     case IDM_10000:
  86.                          CheckMenuItem (hwnd, iCurrentRep, FALSE) ;
  87.                          iCurrentRep = LOUSHORT (mp1) ;
  88.                          CheckMenuItem (hwnd, iCurrentRep, TRUE) ;
  89.                          break ;
  90.  
  91.                     case IDM_START:
  92.                          EnableMenuItem (hwnd, IDM_START, FALSE) ;
  93.                          EnableMenuItem (hwnd, IDM_ABORT, TRUE) ;
  94.  
  95.                          iStatus = STATUS_WORKING ;
  96.                          WinInvalidateRect (hwnd, NULL, FALSE) ;
  97.  
  98.                          iCalcRep = iCurrentRep ;
  99.                          WinPostMsg (hwndObject, WM_START_CALC,
  100.                                    MPFROM2SHORT(iCalcRep, 0), 0L) ;
  101.                          break ;
  102.  
  103.                     case IDM_ABORT:
  104.                          WinPostMsg (hwndObject, WM_ABORT_CALC,
  105.                                                  0L, 0L) ;
  106.  
  107.                          EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  108.                          break ;
  109.      
  110.                     default:
  111.                          break ;
  112.                     }
  113.                break ;
  114.  
  115.           case WM_CALC_DONE:
  116.  
  117.                iStatus = STATUS_DONE ;
  118.                lElapsedTime = (ULONG)mp1 ;
  119.                WinInvalidateRect (hwnd, NULL, FALSE) ;
  120.  
  121.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  122.                EnableMenuItem (hwnd, IDM_ABORT, FALSE) ;
  123.                break ;
  124.  
  125.           case WM_CALC_ABORTED:
  126.  
  127.                iStatus = STATUS_READY ;
  128.                WinInvalidateRect (hwnd, NULL, FALSE) ;
  129.  
  130.                EnableMenuItem (hwnd, IDM_START, TRUE) ;
  131.                break ;
  132.  
  133.           case WM_PAINT:
  134.  
  135.                PaintWindow (hwnd, iStatus, iCalcRep, lElapsedTime) ;
  136.                break ;
  137.  
  138.           case WM_CLOSE:
  139.  
  140.                if (hwndObject)
  141.                     WinPostMsg (hwndObject, WM_QUIT, 0L, 0L) ;
  142.                else
  143.                     WinPostMsg (hwnd, WM_QUIT, 0L, 0L) ;
  144.                break ;
  145.  
  146.           case WM_OBJECT_DESTROYED:
  147.  
  148.                WinPostMsg (hwnd, WM_QUIT, 0L, 0L) ;
  149.                break ;
  150.  
  151.           default:
  152.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  153.           }
  154.      return 0L ;
  155.      }
  156.  
  157. VOID FAR SecondThread ()
  158.      {
  159.      static CHAR szClassName [] = "BigJob5.Object" ;
  160.      HMQ         hmq ;
  161.      QMSG        qmsg ;
  162.  
  163.      hmq = WinCreateMsgQueue (hab, 0) ;
  164.  
  165.      WinRegisterClass (hab, szClassName, ObjectWndProc, 0L, 0) ;
  166.  
  167.      hwndObject = WinCreateWindow (HWND_OBJECT, szClassName,
  168.                     NULL, 0L, 0, 0, 0, 0, NULL, NULL, 0, NULL, NULL) ;
  169.  
  170.      WinPostMsg (hwndClient, WM_OBJECT_CREATED, 0L, 0L) ;
  171.  
  172.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  173.           WinDispatchMsg (hab, &qmsg) ;
  174.  
  175.      WinDestroyWindow (hwndObject) ;
  176.      WinDestroyMsgQueue (hmq) ;
  177.  
  178.      WinPostMsg (hwndClient, WM_OBJECT_DESTROYED, 0L, 0L) ;
  179.  
  180.      DosExit (0, 0) ;
  181.      }
  182.  
  183. MRESULT EXPENTRY ObjectWndProc (HWND hwnd, USHORT msg, MPARAM mp1,
  184.                                                      MPARAM mp2)
  185.      {
  186.      double A ;
  187.      SHORT  i, iCalcRep ;
  188.      LONG   lQueueStatus, lTime ;
  189.  
  190.      switch (msg)
  191.           {
  192.           case WM_START_CALC:
  193.  
  194.                iCalcRep = LOUSHORT (mp1) ;
  195.                lTime = WinGetCurrentTime (hab) ;
  196.  
  197.                for (A = 1.0, i = 0 ; i < iCalcRep ; i++)
  198.                     {
  199.                     lQueueStatus = WinQueryQueueStatus (HWND_DESKTOP) ;
  200.  
  201.                     if (lQueueStatus & QS_POSTMSG)
  202.                          break ;
  203.  
  204.                     A = Savage (A) ;
  205.                     }
  206.  
  207.                if (lQueueStatus & QS_POSTMSG)
  208.                     break ;
  209.  
  210.                lTime = WinGetCurrentTime (hab) - lTime ;
  211.  
  212.                WinPostMsg (hwndClient, WM_CALC_DONE, MPFROMLONG(lTime), 0L) ;
  213.                break ;
  214.  
  215.           case WM_ABORT_CALC:
  216.  
  217.                WinPostMsg (hwndClient, WM_CALC_ABORTED, 0L, 0L) ;
  218.                break ;
  219.  
  220.           default:
  221.                return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  222.           }
  223.      return 0L ;
  224.      }
  225.