多线程专题之线程参数

昨天,网速实在是慢啊,所以没有贴出来  - 多线程专题之线程参数 的文章.好了,现在补起来啦!

1.传递一般参数:

    线程函数:

static DWORD ThreadProc(
     LPVOID lpParameter
     )
{
 //USAGE ONE
 CString *strArg = (CString*)lpParameter;
 *strArg = "Hello World!"; 
 return 0;
}

线程的创建和参数的传递:

void CMultiThreadDlg::OnBtnUsageOne()
{
 // TODO: Add your control notification handler code here
 HANDLE hThread = NULL;
 CString strArg = _T("");
 
 hThread = ::CreateThread(
  NULL/*系统安全描述,NULL*/,
  0/*Windows系统一般线程栈大小为1 MB,创建线程的数目与物理内存和栈空间大小有关*/,
  (LPTHREAD_START_ROUTINE)ThreadProc/*线程启动函数*/,
  (LPVOID)&strArg/*线程启动函数接收的参数*/,
  0/*CREATE_SUSPENDED*/,
  NULL/*线程ID*/);
 /* 如果你用全局的参数的话,建议加上volatile 标志。
 volatile 是告诉编译器不要对该变量作任何优化的,
 即不把它放到寄存器中。多线程中,volatile 是很重要的修饰符*/
 
 if( hThread )
 {
  Sleep(100);        //睡眠一会,让新线程设置字符串
  AfxMessageBox(strArg);
  CloseHandle(hThread/*线程句柄*/);  //关闭线程句柄,减少内核对象的引用记数
 }
}

2.如何传递自定义参数.我们有没有注意到线程参数是个LPVOID类型的参数啊.这个就给了我们很大的传参数的自由度了啊.下面我们看看如何传啊

首先是自定义参数的结构:

typedef struct _ARG
{
 HWND  hWnd;
 CString  strTitle;
 CString  strContext;
}THREADARG,*PTHREADARG; //这是自己随便定义的

然后是线程函数:

static DWORD ThreadProc(
     LPVOID lpParameter
     )
{
  //USAGE TWO
 PTHREADARG pArg = (PTHREADARG)lpParameter;
 MessageBox( pArg->hWnd, pArg->strContext, pArg->strTitle, MB_OK );
 return 0;
}

最后就是,创建线程了啊:

void CMultiThreadDlg::OnBtnUsageTwo()
{
 // TODO: Add your control notification handler code here
 HANDLE  hThread = NULL;
 THREADARG thread_arg;

 thread_arg.hWnd   = NULL;  //记住不能设置成m_hWnd,这样的话会出现死锁。不信,小样,你试试!
 thread_arg.strContext = _T("Hello World!");
 thread_arg.strTitle  = _T("Test Thread");
 
 hThread = ::CreateThread(
  NULL,        //系统安全描述,NULL
  0,         //Windows系统一般线程栈大小为1 MB,创建线程的数目与物理内存和栈空间大小有关
  (LPTHREAD_START_ROUTINE)ThreadProc, //线程启动函数
  (LPVOID)&thread_arg,    //线程启动函数接收的参数
  0,         //CREATE_SUSPENDED
  NULL);        //线程ID
 /* 如果你用全局的参数的话,建议加上volatile 标志。
 volatile 是告诉编译器不要对该变量作任何优化的,
 即不把它放到寄存器中。多线程中,volatile 是很重要的修饰符*/
 
 if( hThread )
 {
  WaitForSingleObject(hThread,INFINITE); //等待线程结束,否则的话你会得不到你想要的结果。(线程同步,以后讲了啊)
  CloseHandle(hThread);     //关闭线程句柄,减少内核对象的引用记数
 }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值