DosSuspendThread (OS/2 1.x)

This call temporarily suspends execution of another thread within the current process until a DosResumeThread call is issued.

Syntax
DosSuspendThread (ThreadID)

Parameters

 * ThreadID (TID) - input : Thread ID to be suspended.

Return Code

 * rc (USHORT) - return:Return code descriptions are:
 * 0 NO_ERROR
 * 309 ERROR_INVALID_THREADID

Remarks
A thread's execution is suspended when another thread in its process issues DosSuspendThread, specifying the ID of the target thread. The thread may not be suspended immediately because it may have locked some system resources that have to be freed first. However, the thread is not allowed to execute further application program instructions until a corresponding DosResumeThread is issued.

DosSuspendThread permits the suspension of only one other thread within the current process. If a thread needs to disable all thread switching within its process so the calling thread can execute time-critical code, it uses DosEnterCritSec and DosExitCritSec calls.

C

 * 1) define INCL_DOSPROCESS

USHORT rc = DosSuspendThread(ThreadID);

TID    ThreadID;      /* Thread ID */ USHORT rc;            /* return code */ 

MASM
 EXTRN DosSuspendThread:FAR INCL_DOSPROCESS    EQU 1

PUSH  WORD    ThreadID      ;Thread ID CALL   DosSuspendThread

Returns WORD 

Example
The following example shows how to suspend and resume execution of a thread within a process. The main thread creates Thread2 and allows it to begin executing. Thread2 iterates through a loop that prints a line and then sleeps, relinquishing its time slice to the main thread. After one iteration by Thread2, the main thread suspends Thread2 and then resumes it. Subsequently, Thread2 completes the remaining three iterations. 
 * 1) define INCL_DOSPROCESS


 * 1) include 


 * 1) define  SEGSIZE       4000   /* Number of bytes requested in segment */
 * 2) define  ALLOCFLAGS    0      /* Segment allocation flags - no sharing */
 * 3) define  SLEEPSHORT    5L     /* Sleep interval - 5 milliseconds */
 * 4) define  SLEEPLONG     75L    /* Sleep interval - 75 milliseconds */
 * 5) define  RETURN_CODE   0      /* Return code for DosExit */

VOID APIENTRY Thread2 { USHORT     i;

/* Loop with four iterations */ for(i=1; i<5; i++) {   printf("In Thread2, i is now %d\n", i);

/* Sleep to relinquish time slice to main thread */ DosSleep(SLEEPSHORT);         /* Sleep interval */ } DosExit(EXIT_THREAD,             /* Action code - end a thread */          RETURN_CODE);            /* Return code */ }

main { TID        ThreadID;             /* Thread identification */ SEL       ThreadStackSel;       /* Segment selector for thread stack */ PBYTE     StackEnd;             /* Ptr. to end of thread stack */ USHORT    rc;

/** Allocate segment for thread stack; make pointer to end of stack. **/ /**  We must allocate a segment in order to preserve segment /** protection for the thread. **/

rc = DosAllocSeg(SEGSIZE,            /* Number of bytes requested */                   &ThreadStackSel,     /* Segment selector (returned) */                   ALLOCFLAGS);         /* Allocation flags - no sharing */ StackEnd = MAKEP(ThreadStackSel, SEGSIZE-1);

/** Start Thread2 **/ if(!(rc=DosCreateThread((PFNTHREAD) Thread2, /* Thread address */                       &ThreadID,         /* Thread ID (returned) */                       StackEnd)))   /* End of thread stack */ printf("Thread2 created.\n");

/* Sleep to relinquish time slice to Thread2 */ if(!(DosSleep(SLEEPSHORT)))                 /* Sleep interval */ printf("Slept a little to let Thread2 execute.\n");

/***** Suspend Thread2, do some work, then resume Thread2 *****/ if(!(rc=DosSuspendThread(ThreadID)))        /* Thread ID */ printf("Thread2 SUSPENDED.\n"); printf("Perform work that will not be interrupted by Thread2.\n"); if(!(rc=DosResumeThread(ThreadID)))         /* Thread ID */ printf("Thread2 RESUMED.\n"); printf("Now we may be interrupted by Thread2.\n");

/* Sleep to allow Thread2 to complete */ DosSleep(SLEEPLONG);                        /* Sleep interval */ } 