版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实践 15 哲学家进餐问题 1. 实践内容说明 (1) 在函数中使用图形方式显示哲学家进餐问题,每个哲学家使用一个线程控制,随机 进行进餐或者思考,使用互斥量和事件进行同步和互斥控制。 2. 程序性质 (1) windows 和控制台混合应用程序 (2) 多线程 3. 运行环境设置 (1)建立项目 在 visual c+ 6.0 开发环境,单击 new 菜单,弹出 new 对话框; 在 new 对话框中选择 project 标签切换至 project 标签页; 在 project 标签页的项目列表中选择 win32 application 选项,location 输入框输入项目 所在的路径,或
2、者单击输入框右侧的按钮,在弹出的 choose directory 对话框中选择项目所 在的磁盘分区和所在的目录;在 project 标签页的 project name 输入框中输入项目名称; project 标签页中的其他选项保持默认选择(单选框 create new workspace 前有黑点, platforms 选项框中 win32 前打勾),完成设置界面如图 10 所示。 图 10 设置项目为 windows 应用 完成设置后单击 ok,new 对话框关闭,弹出 win32 console application step 1 of 1 对 话框。 在 win32 console
3、application step 1 of 1 对话框中选择 an empty project 单选项。 win32 console application step 1 of 1 对话框如图 11 所示。 图 11 说明刚建立的项目为空项目 完成 win32 console application step 1 of 1 对话框后单击 finish 按钮,win32 console application step 1 of 1 对话框关闭,弹出 new project information 对话框。 new project information 对话框中显示了当前建立项目的一些信息。n
4、ew project information 对话框如图 12 所示。 图 12 显示新项目信息 单击 new project information 对话框中的 ok 按钮,关闭 new project information 对话框, 项目建立步骤完成。 (2)建立文件 单击 file 菜单中的 new 菜单项,弹出 new 对话框。 在 new 对话框中单击 files 标签,切换至 files 标签页; 在 files 标签页的文件列表中选择 c+ source file 选项,在 file 输入框中输入文件名。 new 对话框设置如图 13 所示。 图 13 在新建的项目中建立一个
5、c 文件 完成 new 对话框设置后,单击 ok 按钮关闭 new 对话框,在项目中创建文件步骤完成。 (3)输入文件 在创建的文件窗口中输入要调试运行的操作系统源文件。 (4)修改编译设置 单击 project 菜单中的 settings 菜单项,弹出 project settings 对话框。在 project settings 对话框中单击 c/c+标签,切换至 c/c+标签页;在 c/c+标签页中的 category 下拉列表选 择框中选择 code generation 选择项;在 use run-time library 下拉列表选择框中选择 debug multithreaded
6、 dll 选项。设置界面如图 14 所示。 图 14 设置成多线程环境 完成设置后单击 ok 按钮关闭 project settings 对话框。 (5)编译运行 单击 build 菜单中的 rebuild all 菜单项编译项目,或者单击工具栏中 build minibar 工具栏的 build 工具按钮编译项目。build minibar 工具栏形状为 ,build工具按钮对应的图标为 ,对应的快捷键是 f7。 4实现程序#include #include #include #include #define degress_to_radian(x) (x) * 3.14 / 180 typ
7、edef struct hwnd hwnd; /窗口句柄 int chopxy8;/ int id; /哲学家的编号 int iseating; param; #define phil_num 5 /哲学家数目,可改变为其他数目 #define start_point 150 #define desk_diameter 200 /圆桌直径 #define phil_diameter 30 /哲学家圆圈直径#define chop_lenght 50 /筷子长度 #define time 10000 /持续时间长度 int chopsticksphil_num; /筷子的初态int finish
8、edphil_num; /用餐是否完成handle hmutex; /互斥量handle hevent; /事件 unsigned int _stdcall dinemany(lpvoid pparam); int winapi winmain(hinstance hinstance,hinstance hpreinstance,lpstr pszcmdline, int ncmdshow ); lresult callback windowproc(hwnd hwnd, uint umsgid,wparam wparam, lparam lparam ); int winapi winmai
9、n(hinstance hinstance,hinstance hpreinstance,lpstr pszcmdline, int ncmdshow ) static char szappname=哲学家进餐; hwnd hwnd; msg msg; wndclass wndclass; wndclass.style = cs_vredraw | cs_hredraw ; wndclass.lpfnwndproc = windowproc; wndclass.cbclsextra = 0; wndclass.cbwndextra = 0; wndclass.hinstance = hinst
10、ance; wndclass.hicon = loadicon(null,idi_question); wndclass.hcursor = loadcursor(null,idc_arrow); wndclass.hbrbackground = (hbrush)getstockobject(white_brush); wndclass.lpszmenuname = null; wndclass.lpszclassname = szappname;if(0=registerclass(&wndclass) return 0; hwnd=createwindow(szappname,szappn
11、ame,ws_overlappedwindow, cw_usedefault,cw_usedefault,cw_usedefault,cw_usedefault,null, null,hinstance,null); if(0 = hwnd) return 0; showwindow(hwnd,ncmdshow); updatewindow(hwnd); while(getmessage(&msg,null,0,0) translatemessage(&msg); dispatchmessage(&msg); return msg.wparam; lresult callback window
12、proc(hwnd hwnd,uint umsgid,wparam wparam, lparam lparam ) hdc hdc;paintstruct paintstruct; handle hthreadphil_num; int left, right; static int chopstartxphil_num, chopstartyphil_num; /筷子的起始坐标 static int chopendxphil_num, chopendyphil_num; /筷子的结束坐标 static int philxphil_num, philyphil_num; /哲学家的位置 sta
13、tic param pparamphil_num; hpen hpenwhite,holdpen; int i; switch(umsgid) case wm_create: hmutex = createmutex(null,false,null); /创建互斥量 hevent = createevent(null, false, false, null); /创建事件 for(i = 0; i phil_num; i+) chopstartxi=(int)(start_point)+desk_diameter/2+desk_diameter /4*sin(degress_to_radian
14、(90+(360.0/phil_num)*i); chopstartyi=(int)(start_point)+desk_diameter/2+desk_diameter /4*cos(degress_to_radian(90+(360.0/phil_num)*i); chopendxi=(int)(start_point)+desk_diameter/2+desk_diameter /2*sin(degress_to_radian(90+(360.0/phil_num)*i); chopendyi=(int)(start_point)+desk_diameter/2+desk_diamete
15、r /2*cos(degress_to_radian(90+(360.0/phil_num)*i); philxi=(int)(start_point)+desk_diameter/2+(desk_diameter /2+phil_diameter)*cos(degress_to_radian(-(360.0/(phil_num*2) -(360.0/phil_num)*i)-phil_diameter/2); philyi=(int)(start_point)+desk_diameter/2+(desk_diameter /2+phil_diameter)*sin(degress_to_ra
16、dian(-(360.0/(phil_num*2) -(360.0/phil_num)*i)-phil_diameter/2); chopsticksi = 0; finishedi = 1 ; break; /绘图消息 case wm_paint: hdc = beginpaint(hwnd, &paintstruct); /获得视图设备环境 ellipse(hdc,start_point, start_point,start_point+desk_diameter,start_point+ desk_diameter); /画圆桌 for(i = 0; i phil_num; i+) mo
17、vetoex(hdc, chopstartxi, chopstartyi,null); lineto(hdc, chopendxi, chopendyi); for(i = 0; i phil_num; i+) ellipse(hdc,philxi,philyi,philxi+phil_diameter,philyi+ phil_diameter); for(i = 0; i phil_num; i+) if(pparami.iseating = 1) movetoex(hdc,philxi+phil_diameter/2,philyi+phil_diameter /2,null); line
18、to(hdc, pparami.chopxy2, pparami.chopxy3); movetoex(hdc,philxi+phil_diameter/2,philyi+phil_diameter /2,null ); lineto(hdc, pparami.chopxy6, pparami.chopxy7); else hpenwhite = createpen(ps_solid, 3, rgb(255, 255, 255); holdpen = (struct hpen_*)selectobject(hdc,hpenwhite); movetoex(hdc,philxi+phil_dia
19、meter/2,philyi+phil_diameter /2,null); lineto(hdc, pparami.chopxy2, pparami.chopxy3); movetoex(hdc,philxi+phil_diameter/2,philyi+phil_diameter /2, null); lineto(hdc, pparami.chopxy6, pparami.chopxy7); selectobject(hdc, holdpen); deleteobject(hpenwhite); textout(hdc, 20, 20, press s, 7 ); endpaint(hw
20、nd,&paintstruct); /释放视图设备环境 break; case wm_char: if(wparam =s | wparam =s) for(i = 0; i phil_num; i+) chopsticksi = false; resetevent(hevent) ;/事件没信号 for(i = 0; i phil_num; i+) pparami.id = i; pparami.hwnd = hwnd; left = i; right = (i+1) % phil_num; pparami.chopxy0 = chopstartxleft; /左手筷子起始 x 坐标 ppa
21、rami.chopxy1 = chopstartyleft; /左手筷子起始 y 坐标 pparami.chopxy2 = chopendxleft; /左手筷子结束 x 坐标 pparami.chopxy3 = chopendyleft; /左手筷子结束 y 坐标 pparami.chopxy4 = chopstartxright; /右手筷子起始 x 坐标 pparami.chopxy5 = chopstartyright; /右手筷子起始 y 坐标 pparami.chopxy6 = chopendxright; /右手筷子结束 x 坐标 pparami.chopxy7 = chopen
22、dyright; /右手筷子结束 y 坐标 pparami.iseating = 0; hthreadi=(handle)_beginthreadex(null,0,dinemany,&pparami,0, null); invalidaterect(hwnd,null,false); setevent(hevent); /事件有信号 break;case wm_close: for(i=0; iid ; right = (m_pparam-id + 1) % phil_num; while(timedelay 0) waitforsingleobject(hmutex, infinite); i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新型城镇公共服务数字化普惠供给方案
- 旅游景点信息管理系统领导面试指南
- 护理不良事件预防的持续教育
- DB35-T 2295-2026 海峡两岸共通 旅游民宿服务规范
- 项目管理专业就业前景
- 就业定义与课程解析
- 2025年智能家居交互界面设计的用户体验优化策略
- 零售业财务管理创新与实践案例
- 联想工程师招聘面试全解析
- 急诊急救医学的新进展与挑战
- (高清版)DB14∕T 2920-2023 公路桥梁基桩桩底岩溶检测技术规程
- 《路遥人生》读书分享课件
- GB/T 44111-2024电化学储能电站检修试验规程
- 培养高中生主动学习意识
- 信息论与编码期末考试试题
- (高清版)DZT 0004-2015 重力调查技术规范(150 000)
- 营销负责人的优势和劣势
- 光纤传感监测技术
- 加油站防雷应急预案
- 换季衣物收纳整理课件
- 人教版八年级数学下册 (勾股定理)课件
评论
0/150
提交评论