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