home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
sniff16.zip
/
TESTAPP
/
WRMHELP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-12
|
11KB
|
333 lines
/*=========================================================================\
* *
* FILE:wrmhelp.c *
* *
* DESCRIPTION: *
* *
* *
* *
* Copyright 1991 , IBM Corp. *
* *
*-------------------------------------------------------------------------*
* *
* *
* *
* DISCLAIMER OF WARRANTIES. The following [enclosed] code is *
* sample code created by IBM Corporation. This sample code is not *
* part of any standard or IBM product and is provided to you solely *
* for the purpose of assisting you in the development of your * *
* applications. The code is provided "AS IS", without *
* warranty of any kind. IBM shall not be liable for any damages *
* arising out of your use of the sample code, even if they have been *
* advised of the possibility of such damages. * *
* *
* *
* *
* *
* *
* *
* *
* *
*--------------------------------------------------------------------------
*
* This source file contains the following functions:
*
* WormHelp
* SuspendAllThreads
* SaveScreen
* ResumeAllThreads
* RedisplayScreen
\*==============================================================*/
/*--------------------------------------------------------------*\
* Include files, macros, defined constants, and externs
\*--------------------------------------------------------------*/
#define INCL_DOSMEMMGR
#define INCL_KBD
#define INCL_VIO
#define INCL_MOU
#define INCL_DOSPROCESS
#define INCL_DOSSEMAPHORES
#include <os2.h>
#include <string.h>
#include "worms.h"
#include "wrmthrd.h"
#include "wrmhelp.h"
/*--------------------------------------------------------------*\
* Global variables and definitions for this file
\*--------------------------------------------------------------*/
CHAR *pszHelp =
" \
\
Worms Mixed Mode Overview \
\
\
This program is a sample application intended to demonstrate calling \
16 - bit API's from 32 bit code. The Vio, Mou, and KBD subsystem are \
used for this example. Each thread is started with a unique color code \
and will randomly move about the screen. Each time another worm is \
encountered the worms color will change to red, then revert back. \
\
Worms Mixed Mode Help \
\
Additional threads (Worms) may be started by entering 'A' at the keyboard. \
Worms may be Deleted by entering 'D' at the keyboard. The mouse may also \
be used to add worms or delete worms by using the mouse buttons. \
To exit from the program enter 'E'. \
\
From the command line the following options may be specified. \
\
\
worms -s Silent Mode \
worms -x Where x is a value from 1 to 30 indicating the number \
of worms to start of with. Default is 1. \
\
\
Copyright IBM Corp. 1992 \
\
\
\
";
PVOID pvSaveWindBuf;
/*--------------------------------------------------------------*\
* Entry point declarations
\*--------------------------------------------------------------*/
/****************************************************************\
*
*--------------------------------------------------------------
*
* Name:WormHelp()
*
* Purpose: This routine displays the help screen for the
* worms program.
*
*
* Usage:
*
* Method: This routine is the main flow control for the help
* - routine. The other threads will be suspended,the
* current screen is saved in a allocated buffer,
* - display the help screen, wait for a keystroke,
* - restore the old screen,resume child threads and
* free buffer.
* -
* -
*
* Returns:
* TRUE - Error Occurred.
* FALSE No Error Occurred
\****************************************************************/
BOOL
WormHelp(VOID )
{
KBDKEYINFO kbdkeyinfo;
PTIB ptib ;
PPIB ppib ;
ULONG ulPosts;
bHelpEnabled = TRUE;
/*
*freeze all worms
*/
if(SuspendAllThreads() )
{
return(TRUE);
}
/*
*read the screen
*and save it
*/
if(SaveScreen(&pvSaveWindBuf) )
{
return(TRUE);
}
/*
*display the help screen
*/
DisplayHelp();
DosGetInfoBlocks(&ptib,&ppib);
/*
*if we are not
*calling from thread
*one suspend thread,
*so only one thread at a time
*is hitting the keyboard queue
*/
if(ptib->tib_ptib2->tib2_ultid != 1 )
{
DosWaitEventSem(hevWormSem,SEM_INDEFINITE_WAIT);
DosResetEventSem(hevWormSem,&ulPosts);
}
else
{
/*
*wait for any
*response if thread 1
*/
KbdCharIn(&kbdkeyinfo,IO_WAIT,
0) ;
}
/*
*redisplay the saved screen
*/
ReDisplayScreen(pvSaveWindBuf);
/*
*allow all child threads to resume
*/
bHelpEnabled = FALSE;
ResumeAllThreads();
return(FALSE);
}
/****************************************************************\
*
*--------------------------------------------------------------
*
* Name:SuspendAllThreads()
*
* Purpose: This routine allow the calling thread to force the
* other threads that are drawing to the screen to wait
* until this thread is done. The worm (threads) will block
* on the hevDrawSem until it is cleared again. The calling
* thread will wait until the post count on the hevDrawOK
* sem is equal to the number of worms before returnning.
*
* Returns:
* FALSE - if sucessful execution completed
* TRUE - if error
\****************************************************************/
BOOL
SuspendAllThreads(VOID )
{
BOOL fError = FALSE;
ULONG ulPosts =0L;
fDraw = FALSE;
/*
*make sure we don't get
*pre-empted
*/
DosEnterCritSec();
DosResetEventSem(hevDrawOk,&ulPosts);
ulPosts = 0;
DosResetEventSem(hevDrawSem,&ulPosts);
ulPosts = 0;
DosExitCritSec();
/*
*wait till all of the
*threads have
*posted
*/
while(ulPosts < sCurrentThread)
{
DosWaitEventSem(hevDrawOk,SEM_INDEFINITE_WAIT);
DosQueryEventSem(hevDrawOk,&ulPosts);
}
return(fError );
}
/****************************************************************\
*
*--------------------------------------------------------------
*
* Name: DisplayHelp()
*
* Purpose:
*
*
*
* Usage:
*
* Method:
* -
*
* -
* -
*
* -
* -
*
* Returns:
* TRUE - Error occurred
* FALSE No error occurred
\****************************************************************/
BOOL
DisplayHelp(VOID )
{
BYTE bCell[2];
BYTE bhAttr = MKATRB(WM_PALEGRAY,WM_BLUE);
bCell[0] = 0x20;
bCell[1] = MKATRB(WM_PALEGRAY,WM_BLUE);
VioScrollDn(0,0,0xFFFF,0xFFFF,0xFFFF,bCell,hvio);
VioWrtCharStrAtt(pszHelp,strlen(pszHelp),
TOP_ROW,LEFT_COL,&bhAttr,hvio );
}
/****************************************************************\
*
*--------------------------------------------------------------
*
* Name:ResumeAllThreads()
*
* Purpose:
*
*
*
* Usage:
*
* Method:
* -
*
* -
* -
*
* -
* -
*
* Returns:
* FALSE - is always returned
\****************************************************************/
BOOL
ResumeAllThreads(VOID )
{
fDraw = TRUE;
DosPostEventSem(hevDrawSem);
return( FALSE );
}
/*--------------------------------------------------------------*\
* End of file :wrmhelp.c
\*--------------------------------------------------------------*/