线程的创建和结束的方法

创建线程的方法有两种:

一种是使用WinAPI中的CreateThread, 另一中是使用MFC的AfxBeginThread

 

1、使用WinAPI

WINBASEAPI
HANDLE
WINAPI
CreateThread(
    IN LPSECURITY_ATTRIBUTES lpThreadAttributes,
    IN SIZE_T dwStackSize,//指定初始提交栈的大小
    IN LPTHREAD_START_ROUTINE lpStartAddress,//由线程执行,表示线程的起始地址,指定线程入口函数,
    该入口函数的参数类型以及返回类型要与ThreadProc()函数声明的类型要保持一致
    IN LPVOID lpParameter,//指定一个单独的值传递给线程
    IN DWORD dwCreationFlags,//指定控件线程创建的附加标记
    OUT LPDWORD lpThreadId//指向一个用来接收线程的标识符变量
    );

2、使用MFC


两种形式的线程都是用系统全局函数AfxBeginThread添加的,该函数有两种形式。

CWinThread *  AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   
int  nPriority  =  THREAD_PRIORITY_NORMAL,
   UINT nStackSize 
=   0 ,
   DWORD dwCreateFlags 
=   0 ,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs 
=  NULL 
);
CWinThread
*  AfxBeginThread(
   CRuntimeClass
*  pThreadClass,
   
int  nPriority  =  THREAD_PRIORITY_NORMAL,
   UINT nStackSize 
=   0 ,
   DWORD dwCreateFlags 
=   0 ,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs 
=  NULL 
);

 

vc终止线程有三种方法:   
  1.线程可以在自身内部调用AfxEndThread()来终止自身的运行 (不建议使用)
    
  2.可以在线程的外部调用BOOL   TerminateThread(   HANDLE   hThread,   DWORD   dwExitCode   )来强行终止一个线程的运行,然后调用CloseHandle()函数释放线程所占用的堆栈   .(不建议使用)

  TerminateThread会有资源泄漏,不要万不得已,不要用这个函数
  DWORD code;
  if(GetExitCodeThread(MonitorComm,&code))  //MonitorComm 你创建的线程句柄
  if(code==STILL_ACTIVE)
  {
      TerminateThread(MonitorComm,0);
      CloseHandle(MonitorComm);
  }

   这样就安全了
  3.第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。 (建议使用)  

 


 下面的例子来演示第三种方法   
  全局变量m_end来表示是否要结束线程   
    
  bool   m_end   =   false;   
  HWND   hWnd;   
    
  启动线程:   
  CWinThread*   pThread;   
    
  hWnd   =   GetSafeHwnd();   
  pThread   =   AfxBeginThread(ThreadProc,hWnd);   
  pThread->m_bAutoDelete   =   false;   
    
  线程的函数   
  UINT   ThreadProc(LPVOID   pParam);   
  UINT   ThreadProc(LPVOID   pParam)   
  {   
      while(!m_end)   
      {   
          AfxMessageBox("test;");   
          ::Sleep(2000);   
      }   
      return   0;   
  }   
    
  终止线程代码   
  m_end   =   true;   
  WaitForSingleObject(pThread->m_hThread,INFINITE);       //等待线程结束   
  delete   pThread;                 //删除线程 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值