随笔 - 493  文章 - 0  评论 - 97  阅读 - 239万

[转]VC++创建一个线程并传递参数

From: http://tech.e800.com.cn/articles/2009/1126/1259215502260_1.html

近来做个项目需要写点程序,比较烦.net写的老是需要背着.net包走,所以准备用VC++来写,其中用到了线程方面的知识这里记录下来以备后用。

  创建一个工作线程十分简单,只需要两步你的线程就能跑了:(1)实现线程函数和(2)开始线程。不需要由CWinThread派生类,你可以不加修改地使用CWinThread。下面我们来看看如何开始一个线程。  
   
  AfxBeginThread有两种形式,一种是用来创建用户界面线程的,另一种就是用来创建工作线程的。为了开始执行你的线程,只需要向AfxBeginThread提供下面的参数就可以了:  
   
  线程函数的地址    
  传送到线程函数的参数    
  (可选的)线程的优先级,默认的是平常的优先级,如果希望使用其它优先级请参阅::SetThreadPriority    
  (可选的)线程的堆栈大小,默认的大小是和创建线程的堆栈一样大    
  (可选的)如果用户创建的线程在开始的时候在挂起态,而不在运行态,可以设置为CREATE_SUSPENDED    
  (可选的)线程的安全属性,默认的是和父线程的访问权限一样,有关安全信息的格式,请参阅SECURITY_ATTRIBUTES    
  AfxBeginThread为用户创建并初始化一个CWinThread对象,运行这个对象,并返回它的地址,这样通过这个地址用户就可以找到它了。在 这一过程中还要进行许多检查。这一切都不用你操心。那么下面我们来看看线程函数怎么写。线程函数定义了线程要做什么,在进入这个函数的时候线程开始,退出 的时候线程结束。这个函数必须是下面的形式:  
   
  UINT   MyControllingFunction(   LPVOID   pParam   );  
   
  参数是一个32位数,这个参数在线程对象创建时传送给对象的构造函数。至于线程函数要怎么处理这个数,那就随便了,它可能是一个人的年纪,可能是一个文件 的地址,可能是一个窗口句柄,反正你想它是什么就是什么,主动权在你手里。如果参数指的是一个结构,结束可以用来向线程传送参数,也可以让线程把结果传回 主程序,线程需要通知主程序,什么时候来取结果。  
   
  在线程函数结束时,应该返回一个UINT类型的值,说明返回原因,也就是返回代码。通常这个数为0,表示正常返回,当然你也可以定义一个错误编码指示错误 了。至于什么数代表什么,全在你。下面是一个线程函数的例子,这个例子解释如何定义线程函数,也介绍了如何从程序的其它地方控制线程:(为了了解线程的全 部,请安心阅读其它文章)

 

UINT   MyThreadProc(   LPVOID   pParam   )  
  {  
  CMyObject*   pObject   =   (CMyObject*)pParam;  
  if   (pObject   ==   NULL   ||!pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))   return   -1;   //   illegal   parameter  
  //   do   something   with   'pObject'  
  return   0;   //   thread   completed   successfully  
  }  
     
  ......  
     
  //   inside   a   different   function   in   the   program  
  pNewObject   =   new   CMyObject;  
  AfxBeginThread(MyThreadProc,   pNewObject); 
 
  上面的例子是MSDN上写的,下面我还写个简单的,主函数传递参数给线程函数,并且线程函数返回值。
 
主函数:
 
void CNEWDLG::CreateNewThread()
 
{
 
    CString s="hello";
 
    AfxBeginThead(WorkThread,&s);//这里的参数&s完全可以改成你需要的其他类型的地址,实现你的操作。
 
    Sleep(1000);
 
    MessageBox(s,NULL,0);
 
}
 
线程函数:
 
UINT WorkThread(LPVOID pParam) //偶觉得关键是这个参数,它可以传递任何类型。
 
{
 
   CString* s1=(CString*)pParam; //不管你传递的是什么类型,都可以通过这种方式转换后使用。
 
   *s1=" s has been changed!";
 
   return 0;
 
}
 
保存后运行,你会发现s已经被改成"s has been changed!"
posted on   清清飞扬  阅读(2577)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
< 2010年11月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

点击右上角即可分享
微信分享提示