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