beginthreadex 例子

来源:互联网 发布:重庆市干部网络教育 编辑:程序博客网 时间:2024/05/16 19:32

beginthreadex 例子  

基础知识:

uintptr_t _beginthread(    void( *start_address )( void * ),   unsigned stack_size,   void *arglist );uintptr_t _beginthreadex(    void *security,   unsigned stack_size,   unsigned ( *start_address )( void * ),   void *arglist,   unsigned initflag,   unsigned *thrdaddr );
start_address

Start address of a routine that begins execution of a new thread. For _beginthread, the calling

convention is either __cdecl or __clrcall; for _beginthreadex, it is either __stdcall or __clrcall.

stack_size

Stack size for a new thread or 0.

arglist

Argument list to be passed to a new thread or NULL.

security

Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be

inherited by child processes. If NULL, the handle cannot be inherited. Must be NULL for Windows 

95 applications.

initflag

Initial state of a new thread (0 for running or CREATE_SUSPENDED for suspended); use ResumeThread

to execute the thread.

thrdaddr

Points to a 32-bit variable that receives the thread identifier. Might be NULL, in which case it is

not used.

 

 

 

 

在msdn中这样的例子:   
  是关于_beginthreadex的   
  //   crt_begthrdex.cpp   
  //   compile   with:   /MT   
  #include   <windows.h>   
  #include   <stdio.h>   
  #include   <process.h>   
    
  unsigned   Counter;     
  unsigned   __stdcall   SecondThreadFunc(   void*   pArguments   )   
  {   
          printf(   "In   second   thread...\n"   );   
    
          while   (   Counter   <   1000000   )   
                  Counter++;   
    
          _endthreadex(   0   );   
          return   0;   
  }     
    
  int   main()   
  {     
          HANDLE   hThread;   
          unsigned   threadID;   
    
          printf(   "Creating   second   thread...\n"   );   
    
          //   Create   the   second   thread.   
          hThread   =   (HANDLE)_beginthreadex(   NULL,   0,   &SecondThreadFunc,   NULL,   0,   &threadID   );   //NULL表示无传递参数
    
          //   Wait   until   second   thread   terminates.   If   you   comment   out   the   line   
          //   below,   Counter   will   not   be   correct   because   the   thread   has   not   
          //   terminated,   and   Counter   most   likely   has   not   been   incremented   to   
          //   1000000   yet.   
          WaitForSingleObject(   hThread,   INFINITE   );   
          printf(   "Counter   should   be   1000000;   it   is->   %d\n",   Counter   );   
          //   Destroy   the   thread   object.   
          CloseHandle(   hThread   );   
  }

 

=======================

有传递参数:

  #include   <windows.h>   
  #include   <stdio.h>   
  #include   <process.h>   

typedef struct play_s
 {
        int   sliderRange;    

 } Play_Param;

 

  unsigned   Counter;     
  unsigned   __stdcall   SecondThreadFunc(   void*   pArguments   )   
  {   
          Play_Param *pp = (Play_Param *) pArguments;

         int aa = pp->sliderRange;


          while   (   Counter   <   1000000   )   
                  Counter++;   
    
          _endthreadex(   0   );   
          return   0;   
  }     
    
  int   main()   
  {     
          HANDLE   hThread;   
          Play_Param param;

          param.sliderRange = 1000;            
          hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, &param, 0, NULL);//&param表示传递参数
         WaitForSingleObject(   hThread,   INFINITE   );   
         CloseHandle(   hThread   );   
  }

 ---------------------

void Start(Play_Param *param)
 {
        setState(RUN);//设置运行标示

        if( hThread == 0 && ::WaitForSingleObject(hThread ,1) == WAIT_TIMEOUT) //判断是否在运行
             hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, param, 0, NULL );

}

 

原创粉丝点击