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

关于 AfxBeginThread 创建多个线程,该如何处理

2012-04-21 
关于 AfxBeginThread 创建多个线程以下是程序代码void CViewMonitorDlgGroup::PlayCabMoveProc(){while(1)

关于 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如何调度)
[解决办法]
多线程模式下,对于共用资源需要进行同步(排队)处理
[解决办法]

探讨

void CViewMonitorDlgGroup::PlayOpenDoorProc(int iCurLeft)
{
WaitForSingleObject(m_Mutex,INFINITE);

m_Cabinet[iCurLeft].SetBitmap(IDB_BITMAP_LEFT);

ReleaseMutex(m_Mutex);
}……

[解决办法]
你这个如果要强行同步的话可能就失去多线程的意义了
因为那样会导致图片顺序载入
建议做一个结构
封装this指针和iCurLeft
然后把结构指针传入
但是结构对象要保住彼此独立
也就是保证每个iCurLeft有独立副本
当然这这也是权益之计
最好不要让线程执行和主窗口耦合太多
也就是不要用this指针作为参数
[解决办法]
弄 个结构体 每次传递的时候 new 一个结构体对象再把结构体传递进去!

热点排行