mfc 多线程使用

MFC的线程有两种,一种称为Work线程,一种称为UI线程。一般情况下Work线程与UI线程的区别主要在于UI线程有消息队列(并不是有没有界面,这点要注意,UI线程也是可以没有界面的)。

一、有关创建线程的三种方法: 
1.C语言函数,调用_beginthread(); 
2.API函数,调用CreateThread();  该函数创建线程将返回一个线程句柄,通过该句柄你可以控制和操作该线程,线程结束后就关闭该句柄
3.MFC函数,调用AfxBeginThread(); 
推荐使用MFC函数AfxBeginThread(线程函数,this);

利用MFC里的AfxBeginThread函数能很方便地创建线程以及对线程进行等待、唤醒等操作。

1、函数原型

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

2、参数说明

(1)返回值:一个指向新线程的线程对象。

(2)pfnThreadProc:work线程的入口函数,声明一定要如下:UINT MyThreadFunction( LPVOID pParam );

(3)pParam:传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程。

(4)nPriority:线程的优先级,一般设置为 0。让它和主线程具有共同的优先级。

(5)nStackSize:指定新创建的线程的栈的大小。如果为 0,新创建的线程具有和主线程一样的大小的栈。

(6)dwCreateFlags:指定创建线程以后,线程有怎么样的标志。可以指定两个值:

(7)lpSecurityAttrs:指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性。如果为 NULL,那么新创建的线程就具有和主线程一样的安全性

3、线程创建

1)在cpp文件里类的外部进行声明:UINT MyThreadFunction( LPVOID pParam );

2)定义一个线程的工作函数

UINT MyThreadFunction( LPVOID pParam )

{

    函数体

}

3)在主线程里启动:Thread* MyThread=AfxBeginThread(MyThreadFunction , pParam , THREAD_PRIORITY_NORMAL , 0 , 0 , NULL);

4、线程的等待与唤醒

(1)让线程等待(暂时挂起):

MyThread->SuspendThread();

(2)唤醒暂停的线程:

MyThread->ResumeThread();

5、查看线程状态:

DWORD code;

GetExitCodeThread(MyThread->m_hThread , &code);

if(code==STILL_ACTIVE){//线程仍在执行}

else {//线程停止执行}

6、结束线程

三.正确的结束一个Work线程

  因为Work线程是一个全局函数,或者是一个Static函数,所以它的运行完成也就是它的正常退出了。(什么?不明白,示例代码如下)

  1.情况一:

UINT WorkFunc(LPVOID pParam)  
2.	{  
3.	  // 工作   
4.	  ......  
5.	   return 0;  // 就算正常退出了,简单吧   
6.	}  

2.情况二:

Work线程是个死循环或一时半会儿出不来,这时要主线程要发个消息给Work线程,让他退出。

1.  UINT WorkFunc(LPVOID pParam)  
2.	{  
3.	  for(;;)  
4.	  {  
5.	   // ...   
6.	  if( WAIT_OBJECT_0 == WaitForSingleObject(m_hThread, INFINITE)} // 收到激发态的消息   
7.	    {  
8.	      return 0;//正常退出   
9.	     }  
10.	  
11.	 }//end for   
12.	    
13.	 return 0;  
14.	}  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值