|
|
Microsoft OS/2 SDK PM 08-08-1988
/*
Source file for THREAD2 application
*/
#define INCL_WIN
#define INCL_DOS
#include <os2.h>
#include <math.h>
#include <stdio.h>
#include "thread2.h"
#define STATUS_READY 0
#define STATUS_WORKING 1
#define STATUS_DONE 2
#define WM_CALC_DONE (WM_USER + 0)
#define WM_CALC_ABORTED (WM_USER + 1)
/* globals */
HWND vhwndMenu;
HAB vhab;
BOOL vbContinueCalc = FALSE;
HWND vhwndClient;
SHORT viCalcRep;
LONG vlSemTrigger;
TID vidThread;
UCHAR vcThreadStack[4096];
MRESULT FAR PASCAL WndProc(HWND hwnd,
USHORT msg,
MPARAM mp1,
MPARAM mp2);
VOID PASCAL FAR SecondThread(VOID);
double Savage(double A)
{
return tan(atan(exp(log(sqrt(A * A))))) + 1.0;
}
VOID Paint(HWND hwnd,
SHORT iStatus,
SHORT iRep,
LONG lTime)
{
static CHAR *szMessage[3] = {"Ready",
"Working...",
"%d reps in %ld msec."};
CHAR szBuffer[60];
HPS hps;
RECTL rcl;
hps = WinBeginPaint(hwnd, (HPS)NULL, (PRECTL)NULL);
WinQueryWindowRect(hwnd, (PRECTL)&rcl);
WinFillRect(hps, (PRECTL)&rcl, SYSCLR_WINDOW);
sprintf(szBuffer, szMessage[iStatus], iRep, lTime);
WinDrawText(hps, -1, szBuffer, (PRECTL)&rcl,
SYSCLR_WINDOWTEXT, SYSCLR_WINDOW, DT_CENTER | DT_VCENTER);
WinEndPaint(hps);
}
void cdecl main(VOID)
{
static CHAR szClass[] = "Big";
HMQ hmq;
HWND hwndFrame;
QMSG qmsg;
ULONG ulCreate;
vhab = WinInitialize(0);
hmq = WinCreateMsgQueue(vhab, 0);
WinRegisterClass(vhab, szClass, WndProc,
CS_SYNCPAINT | CS_SIZEREDRAW, NULL);
ulCreate = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX |
FCF_SIZEBORDER | FCF_MENU;
hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
WS_VISIBLE,
(PVOID)&ulCreate,
szClass, (PSZ)"Big 2nd Thread",
0L, NULL, ID_RESOURCE,
(HWND FAR *)&vhwndClient);
vhwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
while (WinGetMsg(vhab, &qmsg, NULL, 0, 0))
WinDispatchMsg(vhab, &qmsg);
DosSuspendThread(vidThread);
WinDestroyWindow(hwndFrame);
WinDestroyMsgQueue(hmq);
WinTerminate(vhab);
}
MRESULT FAR PASCAL WndProc(HWND hwnd,
USHORT msg,
MPARAM mp1,
MPARAM mp2)
{
static SHORT iCurrentRep = IDM_10;
static SHORT iStatus = STATUS_READY;
static ULONG lElapsedTime;
switch (msg) {
case WM_CREATE:
DosSemSet(&vlSemTrigger);
if (DosCreateThread(SecondThread, &vidThread,
vcThreadStack + sizeof vcThreadStack))
WinAlarm(HWND_DESKTOP, WA_ERROR);
break;
case WM_COMMAND:
switch (SHORT1FROMMP(mp1)) {
case IDM_10:
case IDM_100:
case IDM_1000:
case IDM_10000:
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(iCurrentRep, TRUE),
MPFROM2SHORT(MIA_CHECKED, 0));
iCurrentRep = SHORT1FROMMP(mp1);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(iCurrentRep, TRUE),
MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
break;
case IDM_START:
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
iStatus = STATUS_WORKING;
WinInvalidateRect(hwnd, NULL, FALSE);
viCalcRep = iCurrentRep;
vbContinueCalc = TRUE;
DosSemClear(&vlSemTrigger);
break;
case IDM_ABORT:
vbContinueCalc = FALSE;
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
break;
}
break;
case WM_CALC_DONE:
iStatus = STATUS_DONE;
lElapsedTime = LONGFROMMP(mp1);
WinInvalidateRect(hwnd, NULL, FALSE);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
break;
case WM_CALC_ABORTED:
iStatus = STATUS_READY;
WinInvalidateRect(hwnd, NULL, FALSE);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
break;
case WM_PAINT:
Paint(hwnd, iStatus, viCalcRep, lElapsedTime);
break;
default:
return WinDefWindowProc(hwnd, msg, mp1, mp2);
}
return 0L;
}
VOID PASCAL FAR SecondThread(VOID)
{
double A;
SHORT i;
LONG lTime;
for (;;) {
DosSemWait(&vlSemTrigger, -1L);
lTime = WinGetCurrentTime(vhab);
for (A = 1.0, i = 0; i < viCalcRep; i++) {
if (!vbContinueCalc)
break;
A = Savage(A);
}
lTime = WinGetCurrentTime(vhab) - lTime;
DosSemSet(&vlSemTrigger);
if (vbContinueCalc)
WinPostMsg(vhwndClient, WM_CALC_DONE, MPFROMLONG(lTime), 0L);
else
WinPostMsg(vhwndClient, WM_CALC_ABORTED, 0L, 0L);
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.