oldpen=(CPen*)pDC->SelectObject(&whitepen);
pDC->MoveTo(imageinfo->pt_chopstick_middle[0]);
pDC->LineTo(imageinfo->pt_chopstick_end[0]);
pDC->MoveTo(imageinfo->pt_chopstick_middle[1]);
pDC->LineTo(imageinfo->pt_chopstick_end[1]);
pDC->SelectObject(oldpen);
oldbrush=(CBrush*)pDC->SelectObject(&brush_eat);
pDC->Ellipse(rect);
pDC->SelectObject(oldbrush);
//pDC->DrawText(num,rect,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
Sleep((imageinfo->index+1)*1000);
//吃完饭,放下筷子
oldpen=(CPen*)pDC->SelectObject(&blackpen);
pDC->MoveTo(imageinfo->pt_chopstick_middle[0]);
pDC->LineTo(imageinfo->pt_chopstick_end[0]);
pDC->MoveTo(imageinfo->pt_chopstick_middle[1]);
pDC->LineTo(imageinfo->pt_chopstick_end[1]);
pDC->SelectObject(oldpen);
oldpen=(CPen*)pDC->SelectObject(&backpen);
pDC->MoveTo(imageinfo->pt_chair);
pDC->LineTo(imageinfo->pt_chopstick_middle[0]);
pDC->MoveTo(imageinfo->pt_chair);
pDC->LineTo(imageinfo->pt_chopstick_middle[1]);
pDC->SelectObject(oldpen);
oldbrush=(CBrush*)pDC->SelectObject(&brush_eat);
pDC->Ellipse(rect);
pDC->SelectObject(oldbrush);
g_cls.Lock();
chopsticks[imageinfo->index]=1;
chopsticks[(imageinfo->index+5)%6]=1;
g_cls.Unlock();
temp.Format("吃完饭,放下叉子!");
::SetWindowText(imageinfo->edit,(LPCTSTR)temp);
Sleep(1000);
caneat=FALSE;
}
}
//::SetWindowText(imageinfo->edit,"1");
return TRUE;
} 线程处理函数里面主要的就是一个临界区变量g_cls,其是MFC提供的一个同步互斥类CCriticalSection的一个对象,其管理控制线程对共享资源的访问,MFC总共提供了四种同步互斥类可以用以处理共享变量的问题(CMutex,CSemaphore,CEvent,CCriticalSection,各有区别,具体可以去网上查找相关资料或者看MSDN)。
临界区对象要和共享变量一起放在MFC框架代码的外面
[cpp] //全局变量
CCriticalSection g_cls;//临界区对象
int chopsticks[6];
//全局变量
CCriticalSection g_cls;//临界区对象
int chopsticks[6]; 在g_cls.Lock()和g_cls.Unlock()之间的变量将限制为同一时刻只能让一位线程访问。
二、演示程序的图形绘制部分
这部分主要就是计算坐标有点麻烦,绘图用CDC自带的一些绘图函数绘制而成。
[cpp] void CPhilosophy_EatingDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
//获得显示框的大小rect
CRect rect;
GetDlgItem(IDC_STATIC_TABLE)->GetWindowRect(&rect);
ScreenToClient(&rect);
/***************************************************************/
//计算这个rect的中心坐标,求出桌子中心的坐标,以及其外接矩形的坐标//
/***************************************************************/
//1.计算桌子中心的坐标
pt_table.x=(rect.right+rect.left)/2;
pt_table.y=(rect.bottom+rect.top)/2;
//2.计算桌子外接矩形的大小
radius_table=(rect.right-rect.left)/3;//我们去显示框长度的1/3做为桌子的半径
rect.left=pt_table.x-radius_table;
rect.right=pt_table.x+radius_table;