Annotation of pmsdk/samples/bigjob/object/object.c, revision 1.1.1.1

1.1       root        1: /*
                      2:    Source code for OBJECT application
                      3: */
                      4: #define INCL_WIN
                      5: #define INCL_DOS
                      6: #include <os2.h>
                      7: #include <math.h>
                      8: #include <stdio.h>
                      9: #include "object.h"
                     10: 
                     11: 
                     12: #define STATUS_READY   0
                     13: #define STATUS_WORKING 1
                     14: #define STATUS_DONE    2
                     15: 
                     16: #define WM_OBJECT_CREATED    (WM_USER + 0)
                     17: #define WM_START_CALC       (WM_USER + 1)
                     18: #define WM_ABORT_CALC       (WM_USER + 2)
                     19: #define WM_CALC_DONE        (WM_USER + 3)
                     20: #define WM_CALC_ABORTED      (WM_USER + 4)
                     21: #define WM_OBJECT_DESTROYED  (WM_USER + 5)
                     22: 
                     23: /* globals */
                     24: HWND vhwndMenu;
                     25: HAB  vhab;
                     26: HWND vhwndClient;
                     27: HWND vhwndObject;
                     28: UCHAR vcThreadStack[4096];
                     29: 
                     30: 
                     31: MRESULT FAR PASCAL WndProc(HWND hwnd,
                     32:                           USHORT msg,
                     33:                           MPARAM mp1,
                     34:                           MPARAM mp2);
                     35: VOID PASCAL FAR SecondThread(VOID);
                     36: MRESULT FAR PASCAL ObjectWndProc(HWND hwnd,
                     37:                              USHORT msg,
                     38:                              MPARAM mp1,
                     39:                              MPARAM mp2);
                     40: 
                     41: 
                     42: 
                     43: double Savage(double A)
                     44: {
                     45:     return tan(atan(exp(log(sqrt(A * A))))) + 1.0;
                     46: }
                     47: 
                     48: 
                     49: 
                     50: VOID Paint(HWND hwnd,
                     51:           SHORT iStatus,
                     52:           SHORT iRep,
                     53:           LONG lTime)
                     54: {
                     55:     static CHAR *szMessage[3] = {"Ready",
                     56:                                 "Working...",
                     57:                                 "%d reps in %ld msec."};
                     58:     CHAR szBuffer[60];
                     59:     HPS hps;
                     60:     RECTL rcl;
                     61: 
                     62:     hps = WinBeginPaint(hwnd, (HPS)NULL, (PRECTL)NULL);
                     63:     WinQueryWindowRect(hwnd, (PRECTL)&rcl);
                     64:     WinFillRect(hps, (PRECTL)&rcl, SYSCLR_WINDOW);
                     65:     sprintf(szBuffer, szMessage[iStatus], iRep, lTime);
                     66:     WinDrawText(hps, -1, szBuffer, (PRECTL)&rcl,
                     67:                SYSCLR_WINDOWTEXT, SYSCLR_WINDOW, DT_CENTER | DT_VCENTER);
                     68:     WinEndPaint(hps);
                     69: }
                     70: 
                     71: 
                     72: 
                     73: int cdecl  main(VOID)
                     74: {
                     75:     static CHAR szClass[] = "Big";
                     76:     HMQ hmq;
                     77:     HWND hwndFrame;
                     78:     QMSG qmsg;
                     79:     ULONG ulCreate;
                     80:     TID idThread;
                     81: 
                     82:     vhab = WinInitialize(0);
                     83:     hmq = WinCreateMsgQueue(vhab, 0);
                     84: 
                     85:     WinRegisterClass(vhab, szClass, WndProc,
                     86:                     CS_SYNCPAINT | CS_SIZEREDRAW, NULL);
                     87: 
                     88:     ulCreate = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX |
                     89:                FCF_SIZEBORDER | FCF_MENU;
                     90:  
                     91:     hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
                     92:                                   WS_VISIBLE,
                     93:                                   (PVOID)&ulCreate,
                     94:                                   szClass, (PSZ)"Big Object Window",
                     95:                                   0L, NULL, ID_RESOURCE,
                     96:                                   (HWND FAR *)&vhwndClient);
                     97:     vhwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
                     98: 
                     99:     WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
                    100:               MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
                    101: 
                    102:     if (DosCreateThread(SecondThread, &idThread,
                    103:                        vcThreadStack + sizeof vcThreadStack))
                    104:        WinAlarm(HWND_DESKTOP, WA_ERROR);
                    105: 
                    106:     while (WinGetMsg(vhab, &qmsg, NULL, 0, 0))
                    107:        WinDispatchMsg(vhab, &qmsg);
                    108: 
                    109:     WinDestroyWindow(hwndFrame);
                    110:     WinDestroyMsgQueue(hmq);
                    111:     WinTerminate(vhab);
                    112:     return 0;
                    113: }
                    114: 
                    115: 
                    116: 
                    117: MRESULT FAR PASCAL WndProc(HWND hwnd,
                    118:                           USHORT msg,
                    119:                           MPARAM mp1,
                    120:                           MPARAM mp2)
                    121: {
                    122:     static SHORT iCalcRep, iCurrentRep = IDM_10;
                    123:     static SHORT iStatus = STATUS_READY;
                    124:     static ULONG lElapsedTime;
                    125: 
                    126: 
                    127:     switch (msg) {
                    128: 
                    129:     case WM_OBJECT_CREATED:
                    130:        WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
                    131:                   MPFROM2SHORT(MIA_DISABLED, 0));
                    132:        break;
                    133: 
                    134:     case WM_COMMAND:
                    135: 
                    136:        switch (SHORT1FROMMP(mp1)) {
                    137: 
                    138:        case IDM_10:
                    139:        case IDM_100:
                    140:        case IDM_1000:
                    141:        case IDM_10000:
                    142:            WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(iCurrentRep, TRUE),
                    143:                       MPFROM2SHORT(MIA_CHECKED, 0));
                    144:            iCurrentRep = SHORT1FROMMP(mp1);
                    145:            WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(iCurrentRep, TRUE),
                    146:                       MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
                    147:            break;
                    148: 
                    149:        case IDM_START:
                    150:            WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
                    151:                       MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
                    152:            WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
                    153:                       MPFROM2SHORT(MIA_DISABLED, 0));
                    154: 
                    155:            iStatus = STATUS_WORKING;
                    156:            WinInvalidateRect(hwnd, NULL, FALSE);
                    157: 
                    158:            iCalcRep = iCurrentRep;
                    159:            WinPostMsg(vhwndObject, WM_START_CALC, MPFROMLONG(iCalcRep), 0L);
                    160: 
                    161:            break;
                    162: 
                    163:        case IDM_ABORT:
                    164:            WinPostMsg(vhwndObject, WM_ABORT_CALC, 0L, 0L);
                    165:            WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
                    166:                       MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
                    167:        default:
                    168:            break;
                    169: 
                    170:        }
                    171:        break;
                    172: 
                    173:     case WM_CALC_DONE:
                    174:        iStatus = STATUS_DONE;
                    175:        lElapsedTime = LONGFROMMP(mp1);
                    176:        WinInvalidateRect(hwnd, NULL, FALSE);
                    177:        WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
                    178:                   MPFROM2SHORT(MIA_DISABLED, 0));
                    179:        WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
                    180:                   MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
                    181:        break;
                    182: 
                    183:     case WM_CALC_ABORTED:
                    184:        iStatus = STATUS_READY;
                    185:        WinInvalidateRect(hwnd, NULL, FALSE);
                    186:        WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
                    187:                   MPFROM2SHORT(MIA_DISABLED, 0));
                    188:        break;
                    189: 
                    190:     case WM_PAINT:
                    191:        Paint(hwnd, iStatus, iCalcRep, lElapsedTime);
                    192:        break;
                    193: 
                    194:     case WM_CLOSE:
                    195:        if (vhwndObject)
                    196:            WinPostMsg(vhwndObject, WM_QUIT, 0L, 0L);
                    197:        else
                    198:            WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
                    199:        break;
                    200: 
                    201:     case WM_OBJECT_DESTROYED:
                    202:        WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
                    203:        break;
                    204: 
                    205:     default:
                    206:        return WinDefWindowProc(hwnd, msg, mp1, mp2);
                    207:     }
                    208: 
                    209:     return 0L;
                    210: }
                    211: 
                    212: 
                    213: 
                    214: VOID PASCAL FAR SecondThread(VOID)
                    215: {
                    216:     static CHAR szObjectClass[] = "Big Object";
                    217:     HMQ hmq;
                    218:     QMSG qmsg;
                    219: 
                    220:     hmq = WinCreateMsgQueue(vhab, 0);
                    221: 
                    222:     WinRegisterClass(vhab, szObjectClass, ObjectWndProc, 0L, NULL);
                    223: 
                    224:     vhwndObject = WinCreateWindow(HWND_OBJECT, szObjectClass, NULL, 0L,
                    225:                                  0, 0, 0, 0, NULL, HWND_TOP, 0, NULL, NULL);
                    226:     WinPostMsg(vhwndClient, WM_OBJECT_CREATED, 0L, 0L);
                    227:     while (WinGetMsg(vhab, &qmsg, NULL, 0, 0))
                    228:        WinDispatchMsg(vhab, &qmsg);
                    229: 
                    230:     WinDestroyWindow(vhwndObject);
                    231:     WinDestroyMsgQueue(hmq);
                    232: 
                    233:     WinPostMsg(vhwndClient, WM_OBJECT_DESTROYED, 0L, 0L);
                    234: 
                    235:     DosExit(0, 0);
                    236: }
                    237: 
                    238: 
                    239: 
                    240: MRESULT FAR PASCAL ObjectWndProc(HWND hwnd,
                    241:                                 USHORT msg,
                    242:                                 MPARAM mp1,
                    243:                                 MPARAM mp2)
                    244: {
                    245:     double A;
                    246:     SHORT i, iCalcRep;
                    247:     LONG lQueueStatus, lTime;
                    248:     switch (msg) {
                    249:     case WM_START_CALC:
                    250:        iCalcRep = SHORT1FROMMP(mp1);
                    251:        lTime = WinGetCurrentTime(vhab);
                    252: 
                    253:        for (A = 1.0, i = 0; i < iCalcRep; i++) {
                    254:            lQueueStatus = WinQueryQueueStatus(HWND_DESKTOP);
                    255:            if (lQueueStatus & QS_POSTMSG)
                    256:                break;
                    257: 
                    258:            A = Savage(A);
                    259:        }
                    260:        if (lQueueStatus & QS_POSTMSG)
                    261:            break;
                    262:        lTime = WinGetCurrentTime(vhab) - lTime;
                    263: 
                    264:        WinPostMsg(vhwndClient, WM_CALC_DONE, MPFROMLONG(lTime), 0L);
                    265:        break;
                    266: 
                    267:     case WM_ABORT_CALC:
                    268:        WinPostMsg(vhwndClient, WM_CALC_ABORTED, 0L, 0L);
                    269:        break;
                    270: 
                    271:     default:
                    272:        return WinDefWindowProc(hwnd, msg, mp1, mp2);
                    273:     }
                    274: 
                    275:     return 0L;
                    276: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.