晕啊,
我在主程序中通过for循环创建多个线程时出现了奇怪的问题,/////////////////////////////////////////
主程序中HANDLE hMyThread[2]; // 线程句柄
CWinThread* pT;for(int i = 0; i < 2; i++ )
{
//构造一个结构体struct Mystruct mystruct作为参数,其中一个变量 num = i;
pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct );
hMyThread[i] = pT->m_hThread; //通过Sleep(1000);或其他动作拖延一点时间
}
/////////////////////////////////////////DWORD MyThreadProc(void* pD)
{
Mystruct *pst = (Mystruct*)
将pst->num显示出来; //
线程实际工作
//
return 0;
}照理说:应该显示0和1,但是我的程序却显示1和1,
即显示的都是for循环中最后一次创建线程时提供的参数,
但是如果我在for循环中//通过Sleep(1000);或其他动作一点时间,
却能正确显示出0和1,
怎么会这样呢?
难道通过同一个线程函数创建多个线程还有很多讲究?
我在主程序中通过for循环创建多个线程时出现了奇怪的问题,/////////////////////////////////////////
主程序中HANDLE hMyThread[2]; // 线程句柄
CWinThread* pT;for(int i = 0; i < 2; i++ )
{
//构造一个结构体struct Mystruct mystruct作为参数,其中一个变量 num = i;
pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct );
hMyThread[i] = pT->m_hThread; //通过Sleep(1000);或其他动作拖延一点时间
}
/////////////////////////////////////////DWORD MyThreadProc(void* pD)
{
Mystruct *pst = (Mystruct*)
将pst->num显示出来; //
线程实际工作
//
return 0;
}照理说:应该显示0和1,但是我的程序却显示1和1,
即显示的都是for循环中最后一次创建线程时提供的参数,
但是如果我在for循环中//通过Sleep(1000);或其他动作一点时间,
却能正确显示出0和1,
怎么会这样呢?
难道通过同一个线程函数创建多个线程还有很多讲究?
解决方案 »
- 位图显示
- 请问如何将数据写入WORD文档,word文档中内嵌表格
- 界面编辑设计,高手帮忙啊!给分
- 完成端口 多次发送问题
- vc,有一个对话框,我贴上了一副bitmap图片,现在我要在这个图片上的某个位置显示文字,怎么实现?这是第一个问题
- 有没有做过在线安装的,请教个问题,在线安装速度太慢(我的程序只有2M不到)怎么解决?谢谢了先!
- VC中Release版本调试及单步跟踪方法
- mvc的基本操作是怎么样的,能提供一些资料吗?
- 如何把datagrid的数据导出到excel中啊?
- 请问DIALOG的开启位置可改变码???
- 关于DeleteFile的问题..大家帮帮忙
- 100分+500元RMB求一解决方案
for(int i = 0; i < 2; i++ )
{
Mystruct mystruct;
mystruct.num = i;
//设置mystruct的其他参数, pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct );
hMyThread[i] = pT->m_hThread; //通过Sleep(1000);或其他动作拖延一点时间
}
DWORD MyThreadProc(void* pD)
{
EnterCriticalSection(&g_cs);
Mystruct *pst = (Mystruct*)
将pst->num显示出来;
LeaveCriticalSection(&g_cs); //
线程实际工作
//
return 0;
}
for(int i = 0; i < 2; i++ )
{
//构造一个结构体struct Mystruct mystruct作为参数,其中一个变量 num = i;
pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct );
hMyThread[i] = pT->m_hThread; //通过Sleep(1000);或其他动作拖延一点时间
}
所在线程为a创建的两个线程为b,c
如果不加入Sleep(1000);则运行的次序可能是
a->b->c或a->c->b,总之a很有可能在b,c运行之前结束bc都显示1
加入Sleep那么a将被挂起,那么在a还没有创建c时,b已经运行结束(显示数字)b显示0c现实1
CWinThread* pT;
Mystruct mystruct[2]; // 参数数组for(int i = 0; i < 2; i++ )
{
mystruct[i].num = i;
//设置mystruct的其他参数, pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct[i] );
hMyThread[i] = pT->m_hThread;
}DWORD MyThreadProc(void* pD)
{
Mystruct *pst = (Mystruct*) pD;
cout<<"线程"<<pst->num<<"开始";
//
线程实际工作
//
cout<<"线程"<<pst->num<<"结束";
return 0;
}能正确显示
线程0开始
线程0开始
线程1结束但却一直没有显示
线程2结束怎么会这样呢?
因为当线程结束后,线程对象会被自动删除,那对象里的句柄也没意义了
而且,可能还没有执行到这个语句,线程就结束了
或者根本线程就没有结束
{
mystruct[i].num = i;
//设置mystruct的其他参数, pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct[i] );
hMyThread[i] = pT->m_hThread;
}
i的最大值是1,怎么会出现2?
在你没有加Sleep时,主调函数可能已经返回,局部变量就没有意义了,
然后在你的工作者线程里即还在使用,结果当然就错了.
即使加上Sleep,虽然结果是正确的,用法也是不对的!所以,应该声明为全局变量或者是静态变量.