|
|
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.