多线程传递结构体参数的问题代码如下 2个线程同时执行。strName在2个线程里面都是456.弹出2个456 对话框。想
多线程传递结构体参数的问题
代码如下 2个线程同时执行。strName在2个线程里面都是456.弹出2个456 对话框。想达到的效果是 两个线程同时执行。第一个线程弹出123 第二个弹出456。请问如何做。
struct threadInfo
{
CString strName;
CString strAge;
};
threadInfo Info;
void ThreadFunc(LPVOID lpParam)
{
threadInfo* pInfo=(threadInfo*)lpParam;
AfxMessageBox(pInfo->strName); //都是456
}
void CtestDlg::OnBnClickedButtonhaha()
{
Info.strName="123";
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info, 0,0);
Info.strName="456";
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info, 0,0);
}
[解决办法]本帖最后由 VisualEleven 于 2012-10-26 22:37:42 编辑 每一个线程都new一份,作为线程函数的参数传递给线程,不需要的时候delete掉
[解决办法]说白了,就是copy原来数据的一份拷贝到线程函数
[解决办法]3楼正解.我来补充
struct threadInfo
{
CString strName;
CString strAge;
};
// threadInfo Info; 这句不要
void ThreadFunc(LPVOID lpParam)
{
threadInfo* pInfo=(threadInfo*)lpParam;
AfxMessageBox(pInfo->strName); // 值不一样了
delete pInfo; // 用完就释放
}
void CtestDlg::OnBnClickedButtonhaha()
{
threadInfo * p1;
threadInfo * p2;
p1 =new threadInfo;
p1->strName="123";
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,p1, 0,0);
p2 =new threadInfo;
p2->strName="456";
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,p2, 0,0);
}
还有,CreateThread 将返回一个 HANDLE, 线程结束时,要用 CloseHandle 关闭这个 HANDLE,否则资源就丢失了,对系统不好
[解决办法]问题的关键在于你使用的单一全局变量传递线程参数,虽然你使用的是2次赋值.但因为线程的执行顺序并不是绝对按你的代码顺序(取决于操作系统的线程调度顺序)。所以你的赋值只有一次是有效的。
解决方案:
1、延时,强制系统按你的代码顺序执行。(这个最简单,但效率要低一些)
Info.strName="123";
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info, 0,0);
Sleep(1000); // 延时
Info.strName="456";
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info, 0,0);
2、动态分配结构参数,传递给不同的线程: (注意在线程函数中对参数的释放)
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,new threadInfo, 0,0);
[解决办法]不确定性是线程的一个特点,所以我觉得创建第二个线程的时候应该先让它挂起,在第一个线程内部在唤醒它。
struct threadInfo
{
HANDLE secondThreadHandle;
CString strName;
CString strAge;
};
void ThreadFunc(LPVOID lpParam)
{
threadInfo* pInfo=(threadInfo*)lpParam;
if(NULL != pInfo->secondThreadHandle)
::ResumeThread(pInfo->secondThreadHandle);
AfxMessageBox(pInfo->strName);
}
void CtestDlg::OnBnClickedButtonhaha()
{
threadInfo Info1;
Info1.strName="123";
threadInfo Info2;
Info2.strName="456";
Info1.secondThreadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info2, CREATE_SUSPENDED, 0);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,&Info1, 0, 0);
}
[解决办法]
还有个思路,就是你设计一个Class,这个Class中的数据部分就是你要共享的数据,但是该数据的读取要加锁。这样你就可以在你的线程中使用了,也不用管你多少个线程,同步问题交给锁去解决。