实践15 哲学家进餐问题

文章描述:-2022年2月19日发(作者:2016年7月17日)实践 15 哲学家进餐问题 1. 实践内容说明 (1)在函数中使用图形方式显示哲学家进餐问题,每个哲学家使用一个线程控制,随机 进行进餐或者思考,使用互斥量和事件进行同步和互斥控制。 2. 程序性质 (1)Windows 和控制台混合应用程序 (2)多线程 3. 运行环境设置 (1)建立项目 在 Visual C++ 6.0

-

实践15 哲学家进餐问题 2022年2月19日发(作者:2016年7月17日)


实践 15 哲学家进餐问题
1. 实践内容说明
(1)在函数中使用图形方式显示哲学家进餐问题,每个哲学家使用一个线程控制,随机 进
行进餐或者思考,使用互斥量和事件进行同步和互斥控制。
2. 程序性质
(1)Windows 和控制台混合应用程序
(2)多线程
3. 运行环境设置
(1)建立项目 在 Visual C++ 6.0 开发环境,单击 ew 菜单,弹出 ew 对话框; 在 ew
对话框中选择 Project 标签切换至 Project 标签页; 在 Project 标签页的项目列表中选择
Win32 Application 选项,Location 输入框输入项目 所在的路径,或者单击输入框右侧的按
钮,在弹出的 Choose Directory 对话框中选择项目所 在的磁盘分区和所在的目录;在
Project 标签页的 Project name 输入框中输入项目名称; Project 标签页中的其他选项保持
默认选择(单选框 Create new workspace 前有黑点, Platforms 选项框中 Win32 前打勾),
完成设置界面如图 10 所示。

图 10 设置项目为 Windows 应用
完成设置后单击 OK,ew 对话框关闭,弹出 Win32 Cole Application – Step 1 of 1 对
话框。 在 Win32 Cole Application – Step 1 of 1 对话框中选择 An empty project 单选项。
Win32 Cole Application – Step 1 of 1 对话框如图 11 所示。

图 11 说明刚建立的项目为空项目
完成 Win32 Cole Application – Step 1 of 1 对话框后单击 Finish 按钮,Win32 Cole
Application – Step 1 of 1 对话框关闭,弹出 ew Project Information 对话框。 ew Project
Information 对话框中显示了当前建立项目的一些信息。ew Project Information 对话框如图
12 所示。
图 12 显示新项目信息
单击 ew Project Information 对话框中的 OK 按钮,关闭 ew Project Information 对话框,
项目建立步骤完成。
(2)建立文件 单击 File 菜单中的 ew 菜单项,弹出 ew 对话框。 在 ew 对话框中
单击 Files 标签,切换至 Files 标签页; 在 Files 标签页的文件列表中选择 C++ Source File
选项,在 File 输入框中输入文件名。 ew 对话框设置如图 13 所示。

图 13 在新建的项目中建立一个 C 文件
完成 ew 对话框设置后,单击 OK 按钮关闭 ew 对话框,在项目中创建文件步骤完成。
(3)输入文件 在创建的文件窗口中输入要调试运行的操作系统源文件。
(4)修改编译设置 单击 Project 菜单中的 Settings 菜单项,弹出 Project Settings 对话框。
在 Project Settings 对话框中单击 CC++标签,切换至 CC++标签页;在 CC++标签页中的
Category 下拉列表选 择框中选择 Code Generation 选择项;在 Use run-time library 下拉列
表选择框中选择 Debug Multithreaded 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_RADIA(x) (x) * 3.14 180
typedef struct
{
HWD hWnd; 窗口句柄
int chopXY[8];
int Id; 哲学家的编号
int isEating;
}PARAM;
#define PHIL_UM 5 哲学家数目,可改变为其他数目
#define START_POIT 150
#define DESK_DIAMETER 200 圆桌直径
#define PHIL_DIAMETER 30 哲学家圆圈直径
#define CHOP_LEGHT 50 筷子长度
#define TIME 10000 持续时间长度
int chopSticks[PHIL_UM]; 筷子的初态
int Finished[PHIL_UM]; 用餐是否完成
HADLE hMutex; 互斥量
HADLE hEvent; 事件
unsigned int __stdcall DineMany(LPVOID pParam);
int WIAPI WinMain(HISTACE hInstance,HISTACE hPreInstance,LPSTR pszCmdLine, int
nCmdShow );
LRESULT CALLBACK WindowProc(HWD hWnd, UIT uMsgId,WPARAM wParam, LPARAM
lParam );
int WIAPI WinMain(HISTACE hInstance,HISTACE hPreInstance,LPSTR pszCmdLine, int
nCmdShow )
{
static char szAppame[]=哲学家进餐
HWD hWnd;
MSG msg;
WDCLASS wndClass;
= CS_VREDRAW | CS_HREDRAW ;
dProc = WindowProc;
xtra = 0;
xtra = 0;
nce = hInstance;
= LoadIcon(ULL,IDI_QUESTIO);
r = LoadCursor(ULL,IDC_ARROW);


kground = (HBRUSH)GetStockObject(WHITE_BRUSH);
nuame = ULL; assame = szAppame;
if(0==RegisterClass(&wndClass))
return 0;
hWnd=CreateWindow(szAppame,szAppame,WS_OVERLAPPEDWIDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,ULL,
ULL,hInstance,ULL);
if(0 == hWnd)
return 0;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,ULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return ;
}
LRESULT CALLBACK WindowProc(HWD hWnd,UIT uMsgId,WPARAM wParam, LPARAM lParam )
{
HDC hDC;
PAITSTRUCT paintStruct;
HADLE hThread[PHIL_UM];
int left, right;
static int chopStartX[PHIL_UM], chopStartY[PHIL_UM]; 筷子的起始坐标
static int chopEndX[PHIL_UM], chopEndY[PHIL_UM]; 筷子的结束坐标
static int philX[PHIL_UM], philY[PHIL_UM]; 哲学家的位置
static PARAM pParam[PHIL_UM];
HPE hPenWhite,hOldPen;
int i;
switch(uMsgId)
{
case WM_CREATE: hMutex = CreateMutex(ULL,FALSE,ULL); 创建互斥量
hEvent = CreateEvent(ULL, FALSE, FALSE, ULL); 创建事件
for(i = 0; i < PHIL_UM; i++)
{
chopStartX[i]=(int)((START_POIT)+DESK_DIAMETER2+DESK_DIAMETER
4*sin(DEGRESS_TO_RADIA(90+(360.0PHIL_UM)*i)));
chopStartY[i]=(int)((START_POIT)+DESK_DIAMETER2+DESK_DIAMETER
4*cos(DEGRESS_TO_RADIA(90+(360.0PHIL_UM)*i)));
chopEndX[i]=(int)((START_POIT)+DESK_DIAMETER2+DESK_DIAMETER
2*sin(DEGRESS_TO_RADIA(90+(360.0PHIL_UM)*i)));
chopEndY[i]=(int)((START_POIT)+DESK_DIAMETER2+DESK_DIAMETER
2*cos(DEGRESS_TO_RADIA(90+(360.0PHIL_UM)*i)));

-

实践15 哲学家进餐问题

发布时间:2022-02-19 01:18:02
文章版权声明:除非注明,否则均为IT技术网-学习WEB前端开发等IT技术的网络平台原创文章,转载或复制请以超链接形式并注明出处。

发表评论

评论列表 (有 19 条评论,156人围观)

最近发表

随便看看

热门文章

标签列表