|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.