MFC实现模拟线程同步(司机与售票员)(附有源码),该怎么处理
MFC实现模拟线程同步(司机与售票员)(附有源码)
各位大哥,小弟我最近要做一个模拟线程同步的程序,要求有图形界面,我设计了一下,大体试了一下,但是遇到很多问题,请各位百忙之中看一下,帮我出出主意,不胜感激!(基于单文档应用程序)
一:总体的设想
首先,对于公交车的线路,模拟的话,我是画了一个矩形;
其次,对于站点的模拟,我画了几个实心的圆来代替;
最后,公交车,我用一幅公交车位图来模拟;
二:代码
1:首先是公交线路和站点的模拟部分:
在OnDraw函数中我这样做:
CPen mypen, * oldpen;
mypen.CreatePen(PS_SOLID,10,RGB(0,0,200));
oldpen=(CPen *)pDC->SelectObject(&mypen);
pDC->RoundRect(CRect(100,100,800,500),CPoint(50,50));
pDC->SelectObject(oldpen);
CBrush brush(RGB(153,0,251));
CBrush *oldbrush=pDC->SelectObject(&brush);
pDC->Ellipse(CRect(435,85,465,115));
pDC->Ellipse(CRect(85,285,115,315));
pDC->Ellipse(CRect(435,485,465,515));
pDC->Ellipse(CRect(785,285,815,315));
pDC->SetTextColor(RGB(255,50,0));
pDC->TextOut(400,470,CString("电子科大长安校区"));
pDC->TextOut(130,270,CString("郭杜站"));
pDC->TextOut(420,130,CString("电子商城"));
pDC->TextOut(750,270,CString("电子科大老校区"));
2:其次:我对于公交车的模拟:
我加载了一幅位图:
在OnInitialUpdate()函数中,我这样做:
CView::OnInitialUpdate();
m_static.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BITMAP, CRect(m_carpoint.x, m_carpoint.y, 32, 32), this);
m_static.SetBitmap(LoadBitmap(AfxGetInstanceHandle(), (LPCTSTR)IDB_BITMAP1));
GetParentFrame()->RecalcLayout();
SetTimer(2,1,NULL);
3:线程控制部分:
利用互斥量来实现,建立两个进程分别是公交车司机进程和售票员进程
位图初始化的时候,是m_carpoint.x=450;m_carpoint.y=500;其中m_carpoint是车子的位置,在Ontimer中是这样写的:
if(m_carpoint.x>100&&m_carpoint.y==500&&car_on)
{
m_carpoint.x-=1;
m_static.MoveWindow(m_carpoint.x,500,30,30,true);
}
else if(m_carpoint.x==100&&m_carpoint.y>100&&car_on)
{
m_carpoint.y-=1;
m_static.MoveWindow(100,m_carpoint.y,30,30,true);
}
else if(m_carpoint.x<800&&m_carpoint.y==100&&car_on)
{
m_carpoint.x+=1;
m_static.MoveWindow(m_carpoint.x,100,30,30,true);
}
else if(m_carpoint.x==800&&m_carpoint.y<500&&car_on)
{
m_carpoint.y+=1;
m_static.MoveWindow(800,m_carpoint.y,30,30,true);
}
if(m_carpoint.x==450&&m_carpoint.y==100||
m_carpoint.x==100&&m_carpoint.y==300||
m_carpoint.x==800&&m_carpoint.y==300||
m_carpoint.x==450&&m_carpoint.y==500)
{
car_on=false;
}
else
car_on=true;
我所理解的线程就是:司机在开车之前去判断售票员是否关门了,售票员开门之前看司机是否停车了,XP操作系统给每个线程分配 时间片,用完的话换到宪哥进程,一次实现程序的并发,在我这个例子中,车子是不是停车应该是在Timer中判断,是不是车子到达了指定的站点,司机线程停车,Sleep两秒中,互斥量交给售票员,售票员开门,释放互斥量,交给司机,司机得到door_on是false即车子关了,开车,等等
DWORD WINAPI CZuoyeView::busdriver(LPVOID lpParameter)
{
while(true)
{
if(!door_on)
{
car_on=true;
WaitForSingleObject(hMutex,INFINITE);
Sleep(2000);
}
else
{
//car_on=false;
ReleaseMutex(hMutex);
}
}
return 0;
}
DWORD WINAPI CZuoyeView::conduct(LPVOID lpParameter)
{
while(true)
{
if(!car_on)
{
door_on=true;
WaitForSingleObject(hMutex,INFINITE);
Sleep(2000);
}
else
{
door_on=false;
ReleaseMutex(hMutex);
}
}
return 0;
}
以上是我的线程函数,但是问题来了:首先,在司机线程判断的时候,也许时间片在售票员那里,该售票员判断的时候,也许时间片在司机那里,如果线程里面去判断是不是停车,那就更糟了,因为,是不是停车由一个点决定,是转瞬即逝的,时间片显得很长,会错过好多站点
,这个程序目前是异常状态,希望大家看一看,我也许对线程同步的概念理解的不是很到位,希望大家指导!也许这个程序设计的时候有什么问题?怎么解决车子停车对与m_carpoint的判断?希望你的回帖和意见,不胜感激,我发帖从来都是回帖有分,希望大家给点主意,分不够我再加!!
各位大哥,小弟我最近要做一个模拟线程同步的程序,要求有图形界面,我设计了一下,大体试了一下,但是遇到很多问题,请各位百忙之中看一下,帮我出出主意,不胜感激!(基于单文档应用程序)
一:总体的设想
首先,对于公交车的线路,模拟的话,我是画了一个矩形;
其次,对于站点的模拟,我画了几个实心的圆来代替;
最后,公交车,我用一幅公交车位图来模拟;
二:代码
1:首先是公交线路和站点的模拟部分:
在OnDraw函数中我这样做:
CPen mypen, * oldpen;
mypen.CreatePen(PS_SOLID,10,RGB(0,0,200));
oldpen=(CPen *)pDC->SelectObject(&mypen);
pDC->RoundRect(CRect(100,100,800,500),CPoint(50,50));
pDC->SelectObject(oldpen);
CBrush brush(RGB(153,0,251));
CBrush *oldbrush=pDC->SelectObject(&brush);
pDC->Ellipse(CRect(435,85,465,115));
pDC->Ellipse(CRect(85,285,115,315));
pDC->Ellipse(CRect(435,485,465,515));
pDC->Ellipse(CRect(785,285,815,315));
pDC->SetTextColor(RGB(255,50,0));
pDC->TextOut(400,470,CString("电子科大长安校区"));
pDC->TextOut(130,270,CString("郭杜站"));
pDC->TextOut(420,130,CString("电子商城"));
pDC->TextOut(750,270,CString("电子科大老校区"));
2:其次:我对于公交车的模拟:
我加载了一幅位图:
在OnInitialUpdate()函数中,我这样做:
CView::OnInitialUpdate();
m_static.Create(NULL, WS_CHILD|WS_VISIBLE|SS_BITMAP, CRect(m_carpoint.x, m_carpoint.y, 32, 32), this);
m_static.SetBitmap(LoadBitmap(AfxGetInstanceHandle(), (LPCTSTR)IDB_BITMAP1));
GetParentFrame()->RecalcLayout();
SetTimer(2,1,NULL);
3:线程控制部分:
利用互斥量来实现,建立两个进程分别是公交车司机进程和售票员进程
位图初始化的时候,是m_carpoint.x=450;m_carpoint.y=500;其中m_carpoint是车子的位置,在Ontimer中是这样写的:
if(m_carpoint.x>100&&m_carpoint.y==500&&car_on)
{
m_carpoint.x-=1;
m_static.MoveWindow(m_carpoint.x,500,30,30,true);
}
else if(m_carpoint.x==100&&m_carpoint.y>100&&car_on)
{
m_carpoint.y-=1;
m_static.MoveWindow(100,m_carpoint.y,30,30,true);
}
else if(m_carpoint.x<800&&m_carpoint.y==100&&car_on)
{
m_carpoint.x+=1;
m_static.MoveWindow(m_carpoint.x,100,30,30,true);
}
else if(m_carpoint.x==800&&m_carpoint.y<500&&car_on)
{
m_carpoint.y+=1;
m_static.MoveWindow(800,m_carpoint.y,30,30,true);
}
if(m_carpoint.x==450&&m_carpoint.y==100||
m_carpoint.x==100&&m_carpoint.y==300||
m_carpoint.x==800&&m_carpoint.y==300||
m_carpoint.x==450&&m_carpoint.y==500)
{
car_on=false;
}
else
car_on=true;
我所理解的线程就是:司机在开车之前去判断售票员是否关门了,售票员开门之前看司机是否停车了,XP操作系统给每个线程分配 时间片,用完的话换到宪哥进程,一次实现程序的并发,在我这个例子中,车子是不是停车应该是在Timer中判断,是不是车子到达了指定的站点,司机线程停车,Sleep两秒中,互斥量交给售票员,售票员开门,释放互斥量,交给司机,司机得到door_on是false即车子关了,开车,等等
DWORD WINAPI CZuoyeView::busdriver(LPVOID lpParameter)
{
while(true)
{
if(!door_on)
{
car_on=true;
WaitForSingleObject(hMutex,INFINITE);
Sleep(2000);
}
else
{
//car_on=false;
ReleaseMutex(hMutex);
}
}
return 0;
}
DWORD WINAPI CZuoyeView::conduct(LPVOID lpParameter)
{
while(true)
{
if(!car_on)
{
door_on=true;
WaitForSingleObject(hMutex,INFINITE);
Sleep(2000);
}
else
{
door_on=false;
ReleaseMutex(hMutex);
}
}
return 0;
}
以上是我的线程函数,但是问题来了:首先,在司机线程判断的时候,也许时间片在售票员那里,该售票员判断的时候,也许时间片在司机那里,如果线程里面去判断是不是停车,那就更糟了,因为,是不是停车由一个点决定,是转瞬即逝的,时间片显得很长,会错过好多站点
,这个程序目前是异常状态,希望大家看一看,我也许对线程同步的概念理解的不是很到位,希望大家指导!也许这个程序设计的时候有什么问题?怎么解决车子停车对与m_carpoint的判断?希望你的回帖和意见,不胜感激,我发帖从来都是回帖有分,希望大家给点主意,分不够我再加!!