程序:
#include <iostream.h>
#include <process.h>
#include <windows.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
HANDLE hStdOut;
CONSOLE_SCREEN_BUFFER_INFO csbi;
BOOL repeat=true;void CharThread(void *posChar);
void NumThread(void *posNum);
void KillThread(void *dummy);int main(int argc,char* argv[])
{
COORD posChar,posNum;
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hStdOut,&csbi);
posChar.X=0;
posChar.Y=0;
if(_beginthread(CharThread,0,(void*)&posChar)==-1)
{
printf("create thread 1 failed!\n");
return -1;
}
posNum.X=csbi.dwMaximumWindowSize.X;
posNum.Y=csbi.dwMaximumWindowSize.Y;
if(_beginthread(NumThread,0,(void*)&posNum)==-1)
{
printf("create thread 2 failed !\n");
return -1;
}
while(repeat)
{
Sleep(200000);
if(_beginthread(KillThread,0,NULL)==-1)
{
printf("create thread kill failed");
return -1;
}
}
return 0;
}
void CharThread(void* posChar)
{
COORD newPos;
DWORD result;
char *str="hello";
char *str1="      ";
int i=0;
bool up=true;
while(repeat)
{
newPos.X=((COORD*)posChar)->X+i;
newPos.Y=((COORD*)posChar)->Y+i;
WriteConsoleOutputCharacter(hStdOut,str,6,newPos,&result);
Sleep(50);
WriteConsoleOutputCharacter(hStdOut,str1,6,newPos,&result);
if(up)
{
i++;
if(i==25)
up=false;
}
else
{
i--;
if(i==0)
up=true;
}
}
}
void NumThread(void* posNum)
{
COORD newPos;
DWORD result;
WORD attr;
char *str="GOOD";
char *str1="      ";
int i=0;
bool up=true;
while(repeat)
{
newPos.X=((COORD*)posNum)->X-i;
newPos.Y=i;
WriteConsoleOutputCharacter(hStdOut,str,5,newPos,&result);
Sleep(50);
WriteConsoleOutputCharacter(hStdOut,str1,5,newPos,&result);
if(up)
{
i++;
if(i==25)
up=false;
}
else
{
i--;
if(i==0)
up=true;
} }
}
void KillThread(void* dummy)
{
repeat=false;
}
错误:
test9.cpp(22) : error C2065: '_beginthread' : undeclared identifier
Error executing cl.exe.

解决方案 »

  1.   

    #include <windows.h>
    #include <process.h>    /* _beginthread, _endthread */
    #include <stddef.h>
    #include <stdlib.h>
    #include <conio.h>
      

  2.   

    Example/* BEGTHRD.C illustrates multiple threads using functions:
     *
     *      _beginthread            _endthread
     *
     *
     * This program requires the multithreaded library. For example,
     * compile with the following command line:
     *     CL /MT /D "_X86_" BEGTHRD.C
     *
     * If you are using the Visual C++ development environment, select the 
     * Multi-Threaded runtime library in the compiler Project Settings 
     * dialog box.
     * 
     */#include <windows.h>
    #include <process.h>    /* _beginthread, _endthread */
    #include <stddef.h>
    #include <stdlib.h>
    #include <conio.h>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 */void 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, &blankcell, 1, oldcoord, &result );
             WriteConsoleOutputCharacter( hStdOut, &blockcell, 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();
    }