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

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

unix.superglobalmegacorp.com

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