File:  [OS/2 SDKs] / pmsdk / samples / bigjob / thread2 / thread2.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 12:28:12 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: pmsdk-1988, HEAD
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);
    }
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.