beginthread

_beginthread,VC/VC++函式,創建一個執行緒。

頭檔案

#include

介紹

函式創建一個執行緒。

uintptr_t _beginthread(

void( *start_address )( void * ),

unsigned stack_size,

void *arglist

);

返回值:

假如成功,函式將會返回一個新執行緒的句柄,用戶可以像這樣聲明一個句柄變數存儲返回值:
HANDLE hStdOut = _beginthread( CheckKey, 0, NULL )。如果失敗_beginthread將返回-1。

start_address

新執行緒的起始地址 ,指向新執行緒調用的函式的起始地址

stack_size

新執行緒的堆疊大小,可以為0

arglist

傳遞給執行緒的參數列表,無參數時為NULL

所在庫檔案:

#include

示例:

// crt_BEGTHRD.C

// compile with: /MT /D "_X86_" /c

// processor: x86

#include

#include /* _beginthread, _endthread */

#include

#include

#include

void Bounce( void *ch );

void CheckKey( void *dummy );

/* GetRandom returns a random integer between min and max. */

#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))

BOOL repeat = TRUE; /* Global repeat flag and video variable */

HANDLE hStdOut; /* Handle for console window */

CONSOLE_SCREEN_BUFFER_INFO csbi; /* Console information structure */

int main()

{

CHAR ch = 'A';

hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );

/* Get display screen's text row and column information. */

GetConsoleScreenBufferInfo( hStdOut, &csbi );

/* Launch CheckKey thread to check for terminating keystroke. */

_beginthread( CheckKey, 0, NULL );

/* Loop until CheckKey terminates program. */

while( repeat )

{

/* On first loops, launch character threads. */

_beginthread( Bounce, 0, (void *) (ch++) );

/* Wait one second between loops. */

Sleep( 1000L );

}

}

/* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */

void CheckKey( void *dummy )

{

_getch();

repeat = 0; /* _endthread implied */

}

/* Bounce - Thread to create and and control a colored letter that moves

* around on the screen.

*

* Params: ch - the letter to be moved

*/

void Bounce( void *ch )

{

/* Generate letter and color attribute from thread argument. */

char blankcell = 0x20;

char blockcell = (char) ch;

BOOL first = TRUE;

COORD oldcoord, newcoord;

DWORD result;

/* Seed random number generator and get initial location. */

srand( _threadid );

newcoord.X = GetRandom( 0, csbi.dwSize.X - 1 );

newcoord.Y = GetRandom( 0, csbi.dwSize.Y - 1 );

while( repeat )

{

/* Pause between loops. */

Sleep( 100L );

/* Blank out our old position on the screen, and draw new letter. */

if( first )

first = FALSE;

else

WriteConsoleOutputCharacter( hStdOut, ␣cell, 1, oldcoord, &result );

WriteConsoleOutputCharacter( hStdOut, █cell, 1, newcoord, &result );

/* Increment the coordinate for next placement of the block. */

oldcoord.X = newcoord.X;

oldcoord.Y = newcoord.Y;

newcoord.X += GetRandom( -1, 1 );

newcoord.Y += GetRandom( -1, 1 );

/* Correct placement (and beep) if about to go off the screen. */

if( newcoord.X < 0 )

newcoord.X = 1;

else if( newcoord.X == csbi.dwSize.X )

newcoord.X = csbi.dwSize.X - 2;

else if( newcoord.Y < 0 )

newcoord.Y = 1;

else if( newcoord.Y == csbi.dwSize.Y )

newcoord.Y = csbi.dwSize.Y - 2;

/* If not at a screen border, continue, otherwise beep. */

else

continue;

Beep( ((char) ch - 'A') * 100, 175 );

}

/* _endthread given to terminate */

_endthread();

}

相關詞條

相關搜尋

熱門詞條

聯絡我們