f:\MyProjects\C++\process\process.cpp(82): error C2664: “_beginthread” : 不能将参数 1 从“void (char *)”转换为“void (__cdecl *)(void *)”
        在匹配目标类型的范围内没有具有该名称的函数例程叫 BOUNCE.C, 标题是 Sample Multithread C Program我已经设好了/MT参数, 在项目属性的 运行里库里设置了多线程, 但还是报错,
按语法来看, char*应该可以转换啊? 不知道还有什么设置没有? 多谢!!

解决方案 »

  1.   

    直接在你的参数前面用(__cdecl *)(void *)强制转换试试---------
      ++C++
    ---------
      

  2.   

    将线程入口函数加一个__cdecl修饰就OK啦。
      

  3.   

    在哪里? void __cdecl BounceProc ( char *MyID ) // 这个是线程入口吗?我在声明和定义上都加了修饰,还是不行,请问你们有没有试一下啊,
    在 _beginthread里面强制(void*)(__cdecl *)报语法错. 第一次想试下c++的多线程,想不到这种问题..
      

  4.   

    代码有点长,因为是MSDN里的例子,我想大家都有.错误提示见我的提问,就是那一句话./*  Bounce - Creates a new thread each time the letter 'a' is typed.
     *  Each thread bounces a happy face of a different color around the screen.
     *  All threads are terminated when the letter 'Q' is entered.
     *
     *  This program requires the multithread library. For example, compile
     *  with the following command line:
     *      CL /MT BOUNCE.C
     */#include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>
    #include <process.h>#define MAX_THREADS  32/* getrandom returns a random number between min and max, which must be in
     * integer range.
     */
    #define getrandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))void main( void );                     /* Thread 1: main */
    void KbdFunc( void  );                 /* Keyboard input, thread dispatch */
    void BounceProc( char * MyID );        /* Threads 2 to n: display */
    void ClearScreen( void );              /* Screen clear */
    void ShutDown( void );                 /* Program shutdown */
    void WriteTitle( int ThreadNum );      /* Display title bar information */HANDLE  hConsoleOut;                   /* Handle to the console */
    HANDLE  hRunMutex;                     /* "Keep Running" mutex */
    HANDLE  hScreenMutex;                  /* "Screen update" mutex  */
    int     ThreadNr;                      /* Number of threads started */
    CONSOLE_SCREEN_BUFFER_INFO csbiInfo;   /* Console information */
    void main()                            /* Thread One */
    {
        /* Get display screen information & clear the screen.*/
        hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE );
        GetConsoleScreenBufferInfo( hConsoleOut, &csbiInfo );
        ClearScreen();
        WriteTitle( 0 );
        /* Create the mutexes and reset thread count. */
        hScreenMutex = CreateMutex( NULL, FALSE, NULL );   /* Cleared */
        hRunMutex = CreateMutex( NULL, TRUE, NULL );       /* Set */
        ThreadNr = 0;    /* Start waiting for keyboard input to dispatch threads or exit. */
        KbdFunc();    /* All threads done. Clean up handles. */
        CloseHandle( hScreenMutex );
        CloseHandle( hRunMutex );
        CloseHandle( hConsoleOut );
    }void ShutDown( void )                  /* Shut down threads */
    {
        while ( ThreadNr > 0 )
        {
                /* Tell thread to die and record its death. */
                ReleaseMutex( hRunMutex );
                ThreadNr--;   
        }
        /* Clean up display when done */
        WaitForSingleObject( hScreenMutex, INFINITE );
        ClearScreen();
    }void KbdFunc( void )                   /* Dispatch and count threads. */
    {
        int         KeyInfo;    do
        {
            KeyInfo = _getch();
            if( tolower( KeyInfo ) == 'a' && ThreadNr < MAX_THREADS )
            {
                ThreadNr++;
                _beginthread( BounceProc, 0, &ThreadNr );
                WriteTitle( ThreadNr );
            }
        } while( tolower( KeyInfo ) != 'q' );    ShutDown();
    }void BounceProc( char *MyID )
    {
        char      MyCell, OldCell;
        WORD      MyAttrib, OldAttrib;
        char      BlankCell = 0x20;
        COORD     Coords, Delta;
        COORD     Old = {0,0};
        DWORD     Dummy;/* Generate update increments and initial display coordinates. */
        srand( (unsigned) *MyID * 3 );
        Coords.X = getrandom( 0, csbiInfo.dwSize.X - 1 );
        Coords.Y = getrandom( 0, csbiInfo.dwSize.Y - 1 );
        Delta.X = getrandom( -3, 3 );
        Delta.Y = getrandom( -3, 3 );    /* Set up "happy face" & generate color attribute from thread number.*/
        if( *MyID > 16)
            MyCell = 0x01;                 /* outline face */
        else
            MyCell = 0x02;                 /* solid face */
        MyAttrib =  *MyID & 0x0F;          /* force black background */    do
        {
            /* Wait for display to be available, then lock it. */
            WaitForSingleObject( hScreenMutex, INFINITE );        /* If we still occupy the old screen position, blank it out. */
            ReadConsoleOutputCharacter( hConsoleOut, &OldCell, 1, Old, &Dummy );
            ReadConsoleOutputAttribute( hConsoleOut, &OldAttrib, 1, Old, &Dummy );
            if (( OldCell == MyCell ) && (OldAttrib == MyAttrib))
                WriteConsoleOutputCharacter( hConsoleOut, &BlankCell, 1, Old, &Dummy );        /* Draw new face, then clear screen lock */
            WriteConsoleOutputCharacter( hConsoleOut, &MyCell, 1, Coords, &Dummy );
            WriteConsoleOutputAttribute( hConsoleOut, &MyAttrib, 1, Coords, &Dummy );
            ReleaseMutex( hScreenMutex );        /* Increment the coordinates for next placement of the block. */
            Old.X = Coords.X;
            Old.Y = Coords.Y;
            Coords.X += Delta.X;
            Coords.Y += Delta.Y;        /* If we are about to go off the screen, reverse direction */
            if( Coords.X < 0 || Coords.X >= csbiInfo.dwSize.X )
            {
                Delta.X = -Delta.X;
                Beep( 400, 50 );
            }
            if( Coords.Y < 0 || Coords.Y > csbiInfo.dwSize.Y )
            {
                Delta.Y = -Delta.Y;
                Beep( 600, 50 );
            }
        }
        /* Repeat while RunMutex is still taken. */
        while ( WaitForSingleObject( hRunMutex, 75L ) == WAIT_TIMEOUT );}void WriteTitle( int ThreadNum )
    {
        char    NThreadMsg[80];    sprintf( NThreadMsg, "Threads running: %02d.  Press 'A' to start a thread,'Q' to quit.", ThreadNum );
        SetConsoleTitle( NThreadMsg );
    }void ClearScreen( void )
    {
        DWORD    dummy;
        COORD    Home = { 0, 0 };
        FillConsoleOutputCharacter( hConsoleOut, ' ', csbiInfo.dwSize.X * csbiInfo.dwSize.Y, Home, &dummy );
    }