beginthreadex 例子

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 );

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值