多线程专题之线程参数

多线程专题之线程参数 

多线程应用 2010-11-28 22:12:45 阅读84 评论0    字号: 订阅

.传递一般参数:

    线程函数:

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);     //关闭线程句柄,减少内核对象的引用记数
 }
}

原文地址:https://www.cnblogs.com/tianlangshu/p/1989556.html