.传递一般参数:
线程函数:
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); //关闭线程句柄,减少内核对象的引用记数
}
}