首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

多线程传递结构体参数的有关问题

2012-12-31 
多线程传递结构体参数的问题代码如下 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掉
[解决办法]
引用:
引用:
每一个线程都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中的数据部分就是你要共享的数据,但是该数据的读取要加锁。这样你就可以在你的线程中使用了,也不用管你多少个线程,同步问题交给锁去解决。

热点排行