您的位置:首页 > 其它

多线程专题之线程参数

2011-03-20 16:50 162 查看


天狼鼠

加博友 关注他

最新日志

在VC 中如何隐藏一个主程序

主窗口向子控件发送消息

菜单项

SetClassLong,GetClassLong

按钮和输入焦点

子窗口向父窗口发送消息

该作者的其他文章

博主推荐

相关日志

随机阅读

首页推荐

日本媒体怎样报道大地震

大麻在手我不敢吸

“中医治癌”是骗局

抢盐根本原因是民众科学素养低

日本超市的盐在打折卖

后院来了一只受伤的小狐狸

更多>>
对“推广广告”提建议

多线程专题之MFC创建线程(1)

DLL专题之MFC规则库和扩展库

多线程专题之线程参数

多线程应用 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); //关闭线程句柄,减少内核对象的引用记数
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: