关于 AfxBeginThread 创建多个线程
以下是程序代码
void CViewMonitorDlgGroup::PlayCabMoveProc()
{
while(1)
{
for(int i=0;i<4;i++)
{
this->iCurLeft = i; //将i值做为参数传递进去
m_hPlayDoor = AfxBeginThread(PlayOpenDoorThread,this);
}
}
}
UINT CViewMonitorDlgGroup::PlayOpenDoorThread(void *pParam)
{
CViewMonitorDlgGroup *pDlg = (CViewMonitorDlgGroup *)pParam;
pDlg->PlayOpenDoorProc(pDlg->iCurLeft);
return 0;
}
void CViewMonitorDlgGroup::PlayOpenDoorProc(int iCurLeft)
{
m_Cabinet[iCurLeft].SetBitmap(IDB_BITMAP_LEFT);
}
此段程序运行时只看到i=3时 加载程序的效果,为什么其它i值时图片没有加载。
[解决办法]
for(int i=0;i<4;i++)
{
this->iCurLeft = i; //这里会被循环覆盖掉,造成错误
循环中AfxBeginThread()启动的线程,并非是在AfxBeginThread()函数执行完毕后就保证立即执行的,很可能循环了好多次了,其中某个线程才开始执行(具体顺序取决于CPU如何调度)
[解决办法]
多线程模式下,对于共用资源需要进行同步(排队)处理
[解决办法]
[解决办法]
你这个如果要强行同步的话可能就失去多线程的意义了
因为那样会导致图片顺序载入
建议做一个结构
封装this指针和iCurLeft
然后把结构指针传入
但是结构对象要保住彼此独立
也就是保证每个iCurLeft有独立副本
当然这这也是权益之计
最好不要让线程执行和主窗口耦合太多
也就是不要用this指针作为参数
[解决办法]
弄 个结构体 每次传递的时候 new 一个结构体对象再把结构体传递进去!