File:  [OS/2 SDKs] / pmsdk / samples / bigjob / object / object.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 code for OBJECT application
*/
#define INCL_WIN
#define INCL_DOS
#include <os2.h>
#include <math.h>
#include <stdio.h>
#include "object.h"


#define STATUS_READY	0
#define STATUS_WORKING	1
#define STATUS_DONE	2

#define WM_OBJECT_CREATED    (WM_USER + 0)
#define WM_START_CALC	     (WM_USER + 1)
#define WM_ABORT_CALC	     (WM_USER + 2)
#define WM_CALC_DONE	     (WM_USER + 3)
#define WM_CALC_ABORTED      (WM_USER + 4)
#define WM_OBJECT_DESTROYED  (WM_USER + 5)

/* globals */
HWND vhwndMenu;
HAB  vhab;
HWND vhwndClient;
HWND vhwndObject;
UCHAR vcThreadStack[4096];


MRESULT FAR PASCAL WndProc(HWND hwnd,
			   USHORT msg,
			   MPARAM mp1,
			   MPARAM mp2);
VOID PASCAL FAR SecondThread(VOID);
MRESULT FAR PASCAL ObjectWndProc(HWND hwnd,
			      USHORT msg,
			      MPARAM mp1,
			      MPARAM mp2);



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);
}



int cdecl  main(VOID)
{
    static CHAR szClass[] = "Big";
    HMQ hmq;
    HWND hwndFrame;
    QMSG qmsg;
    ULONG ulCreate;
    TID idThread;

    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 Object Window",
				   0L, NULL, ID_RESOURCE,
				   (HWND FAR *)&vhwndClient);
    vhwndMenu = WinWindowFromID(hwndFrame, FID_MENU);

    WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
	       MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));

    if (DosCreateThread(SecondThread, &idThread,
			vcThreadStack + sizeof vcThreadStack))
	WinAlarm(HWND_DESKTOP, WA_ERROR);

    while (WinGetMsg(vhab, &qmsg, NULL, 0, 0))
	WinDispatchMsg(vhab, &qmsg);

    WinDestroyWindow(hwndFrame);
    WinDestroyMsgQueue(hmq);
    WinTerminate(vhab);
    return 0;
}



MRESULT FAR PASCAL WndProc(HWND hwnd,
			   USHORT msg,
			   MPARAM mp1,
			   MPARAM mp2)
{
    static SHORT iCalcRep, iCurrentRep = IDM_10;
    static SHORT iStatus = STATUS_READY;
    static ULONG lElapsedTime;


    switch (msg) {

    case WM_OBJECT_CREATED:
	WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
		   MPFROM2SHORT(MIA_DISABLED, 0));
	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);

	    iCalcRep = iCurrentRep;
	    WinPostMsg(vhwndObject, WM_START_CALC, MPFROMLONG(iCalcRep), 0L);

	    break;

	case IDM_ABORT:
	    WinPostMsg(vhwndObject, WM_ABORT_CALC, 0L, 0L);
	    WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
		       MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
	default:
	    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, iCalcRep, lElapsedTime);
	break;

    case WM_CLOSE:
	if (vhwndObject)
	    WinPostMsg(vhwndObject, WM_QUIT, 0L, 0L);
	else
	    WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
	break;

    case WM_OBJECT_DESTROYED:
	WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
	break;

    default:
	return WinDefWindowProc(hwnd, msg, mp1, mp2);
    }

    return 0L;
}



VOID PASCAL FAR SecondThread(VOID)
{
    static CHAR szObjectClass[] = "Big Object";
    HMQ hmq;
    QMSG qmsg;

    hmq = WinCreateMsgQueue(vhab, 0);

    WinRegisterClass(vhab, szObjectClass, ObjectWndProc, 0L, NULL);

    vhwndObject = WinCreateWindow(HWND_OBJECT, szObjectClass, NULL, 0L,
				  0, 0, 0, 0, NULL, HWND_TOP, 0, NULL, NULL);
    WinPostMsg(vhwndClient, WM_OBJECT_CREATED, 0L, 0L);
    while (WinGetMsg(vhab, &qmsg, NULL, 0, 0))
	WinDispatchMsg(vhab, &qmsg);

    WinDestroyWindow(vhwndObject);
    WinDestroyMsgQueue(hmq);

    WinPostMsg(vhwndClient, WM_OBJECT_DESTROYED, 0L, 0L);

    DosExit(0, 0);
}



MRESULT FAR PASCAL ObjectWndProc(HWND hwnd,
				 USHORT msg,
				 MPARAM mp1,
				 MPARAM mp2)
{
    double A;
    SHORT i, iCalcRep;
    LONG lQueueStatus, lTime;
    switch (msg) {
    case WM_START_CALC:
	iCalcRep = SHORT1FROMMP(mp1);
	lTime = WinGetCurrentTime(vhab);

	for (A = 1.0, i = 0; i < iCalcRep; i++) {
	    lQueueStatus = WinQueryQueueStatus(HWND_DESKTOP);
	    if (lQueueStatus & QS_POSTMSG)
		break;

	    A = Savage(A);
	}
	if (lQueueStatus & QS_POSTMSG)
	    break;
	lTime = WinGetCurrentTime(vhab) - lTime;

	WinPostMsg(vhwndClient, WM_CALC_DONE, MPFROMLONG(lTime), 0L);
	break;

    case WM_ABORT_CALC:
	WinPostMsg(vhwndClient, WM_CALC_ABORTED, 0L, 0L);
	break;

    default:
	return WinDefWindowProc(hwnd, msg, mp1, mp2);
    }

    return 0L;
}

unix.superglobalmegacorp.com

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