MFC实现模拟线程同步(司机与售票员)(附有源码)

rosslinhua 2008-11-24 06:28:56
加精
各位大哥,小弟我最近要做一个模拟线程同步的程序,要求有图形界面,我设计了一下,大体试了一下,但是遇到很多问题,请各位百忙之中看一下,帮我出出主意,不胜感激!(基于单文档应用程序)
一:总体的设想
首先,对于公交车的线路,模拟的话,我是画了一个矩形;
其次,对于站点的模拟,我画了几个实心的圆来代替;
最后,公交车,我用一幅公交车位图来模拟;
二:代码
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的判断?希望你的回帖和意见,不胜感激,我发帖从来都是回帖有分,希望大家给点主意,分不够我再加!!

...全文
2715 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhdj1109 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 的回复:]

学多线程不精,帮顶
[/Quote]

太佩服了!! 学习了!!
jiangjun_ 2012-07-24
  • 打赏
  • 举报
回复
学多线程不精,帮顶
中级伴读 2011-04-06
  • 打赏
  • 举报
回复
现实生活中,开门关门,开车停车都是司机来做的
cfanshappy 2011-04-03
  • 打赏
  • 举报
回复
好东西,学习一下
Bestrem_9 2010-06-01
  • 打赏
  • 举报
回复
呵呵,围观一下。。。
liaoanliao 2010-05-31
  • 打赏
  • 举报
回复
学习一下
ghvvvv 2010-05-14
  • 打赏
  • 举报
回复
学习了....正好借鉴
clever101 2009-08-05
  • 打赏
  • 举报
回复
学习,正在看操作系统中的线程调度内容,正好借鉴一下!
yslijt 2009-02-15
  • 打赏
  • 举报
回复
学习下
rosslinhua 2008-12-06
  • 打赏
  • 举报
回复
断网了,一来想让大家多说想法,而来也没机会结贴,就拖了这么长时间!!我的天啊!!这么多人回帖,崩溃啊!!大家太热情了,这分数怎么分啊?就100分,我说过只要回帖就有分的,哎!结贴吧!我的这个东西就是本科操作系统中一个基本的问题,现在已经基本解决了,用的是事件!结贴吧!!
云风 2008-12-01
  • 打赏
  • 举报
回复
收藏了
hustzcj 2008-12-01
  • 打赏
  • 举报
回复
up...
capital2008 2008-12-01
  • 打赏
  • 举报
回复
非常好
someon 2008-12-01
  • 打赏
  • 举报
回复
up
学习
jfm98 2008-11-30
  • 打赏
  • 举报
回复
haoa ,不错啊 真的不错啊 我不不是啊多少
yanjing_mail 2008-11-30
  • 打赏
  • 举报
回复
学习
grayguygg 2008-11-29
  • 打赏
  • 举报
回复
openmp
Learn-anything 2008-11-29
  • 打赏
  • 举报
回复
up
up
up
……
lzh9955 2008-11-29
  • 打赏
  • 举报
回复
up
itymx 2008-11-29
  • 打赏
  • 举报
回复
顶 顶 顶 顶 顶 顶 顶 顶 顶 建了个群 欢迎加入 群号:52993264
加载更多回复(35)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧