亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? philosopherview.cpp

?? 關于操作系統(tǒng)哲學家進餐的動態(tài)演示程序
?? CPP
字號:
// PhilosopherView.cpp : implementation of the CPhilosopherView class
//

#include "stdafx.h"
#include "Philosopher.h"

#include "PhilosopherDoc.h"
#include "PhilosopherView.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


BOOL chopSticks[PHIL_NUM] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
BOOL Finished[PHIL_NUM] ={TRUE, TRUE, TRUE, TRUE, TRUE, TRUE};
CMutex *m_pMutex = NULL;
CEvent *m_pEvent = NULL;

UINT DineOnce(LPVOID pParam);
UINT DineMany(LPVOID pParam);
/////////////////////////////////////////////////////////////////////////////
// CPhilosopherView

IMPLEMENT_DYNCREATE(CPhilosopherView, CView)

BEGIN_MESSAGE_MAP(CPhilosopherView, CView)
	//{{AFX_MSG_MAP(CPhilosopherView)
	ON_COMMAND(ID_PLAY_ONCE, OnPlayOnce)
	ON_COMMAND(ID_PLAY_MANY, OnPlayMany)
	ON_UPDATE_COMMAND_UI(ID_PLAY_MANY, OnUpdatePlayMany)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPhilosopherView construction/destruction

CPhilosopherView::CPhilosopherView()
{
	// TODO: add construction code here
	for(int i = 0; i < PHIL_NUM; i++)
		m_pThread[i] = NULL;
	m_pMutex = new CMutex;  //用于控制對數(shù)組chopSticks的訪問
	m_pEvent = new CEvent(FALSE, TRUE); //用于控制線程,讓線程同時開始執(zhí)行,bManualReset 為true
}

CPhilosopherView::~CPhilosopherView()
{
	delete m_pMutex;
	delete m_pEvent;
}

BOOL CPhilosopherView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CPhilosopherView drawing

void CPhilosopherView::OnDraw(CDC* pDC)
{
	CPhilosopherDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	int chopStartX[6], chopStartY[6], chopEndX[6], chopEndY[6];
	int philX[6], philY[6];
	int i;
	CPen pen(PS_SOLID, 3, RGB(0, 0, 0));
	CRect rect = CRect(150, 150, 150+DESK_DIAMETER, 150+DESK_DIAMETER);

	//畫圓桌
	pDC->Ellipse(rect);
	CHOP_COORDINATE(150, 150);
	CPen *pOldPen = (CPen*)pDC->SelectObject(&pen);

	//畫筷子
	for(i = 0; i < PHIL_NUM; i++)
	{
		pDC->MoveTo(chopStartX[i], chopStartY[i]);
		pDC->LineTo(chopEndX[i], chopEndY[i]);
	}
	pDC->SelectObject(pOldPen);
	PHIL_COORDINATE(150, 150);

	//畫哲學家
	for(i = 0; i< PHIL_NUM; i++)
	{
		pDC->Ellipse(philX[i], philY[i], philX[i] + PHIL_DIAMETER, philY[i] + PHIL_DIAMETER); 
	}
}

/////////////////////////////////////////////////////////////////////////////
// CPhilosopherView printing

BOOL CPhilosopherView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CPhilosopherView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CPhilosopherView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CPhilosopherView diagnostics

#ifdef _DEBUG
void CPhilosopherView::AssertValid() const
{
	CView::AssertValid();
}

void CPhilosopherView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CPhilosopherDoc* CPhilosopherView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPhilosopherDoc)));
	return (CPhilosopherDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPhilosopherView message handlers

void CPhilosopherView::OnPlayOnce() 
{
	// TODO: Add your command handler code here
	int i, left, right;
	int chopStartX[6], chopStartY[6], chopEndX[6], chopEndY[6];
	int philX[6], philY[6];
	PARAM *pParam = NULL;
    
	for(i = 0; i < PHIL_NUM; i++)
	{
		chopSticks[i] = FALSE;  //初始時筷子可用
	}
	m_pEvent->ResetEvent(); //初始時,m_pEvent不可訪問

	CHOP_COORDINATE(150, 150);  //生成筷子的坐標
	PHIL_COORDINATE(150, 150);  //生成哲學家的坐標
	for(i = 0; i < PHIL_NUM; i++)
	{ //生成要傳入線程的參數(shù)

		pParam = new PARAM;
		if(NULL == pParam)
		{
			break;
		}
		pParam->Id = i;
		pParam->m_hWnd = this->m_hWnd;
		pParam->philX = philX[i];
		pParam->philY = philY[i];
		left = i;
		right = (i+1) % PHIL_NUM;
		pParam->chopXY[0] = chopStartX[left];
		pParam->chopXY[1] = chopStartY[left];
		pParam->chopXY[2] = chopEndX[left];
		pParam->chopXY[3] = chopEndY[left];
		pParam->chopXY[4] = chopStartX[right];
		pParam->chopXY[5] = chopStartY[right];
		pParam->chopXY[6] = chopEndX[right];
		pParam->chopXY[7] = chopEndY[right];

		m_pThread[i] = AfxBeginThread(DineOnce, (LPVOID)pParam);
	}

	//Invalidate();
	//Invalidate(FALSE);
	m_pEvent->SetEvent();//是m_pEvent可訪問,激活所有的哲學家線程
	pParam = NULL;
}

/**********************************************************************
DineOnce 線程函數(shù)一直處于Lock的調(diào)用,這是因為線程的啟動也要一段時間,若線程
執(zhí)行的時間小于線程創(chuàng)建的時間,則有可能先被創(chuàng)建的線程已經(jīng)執(zhí)行完畢,而
后面的線程還沒開始執(zhí)行。
***********************************************************************/
UINT DineOnce(LPVOID pParam)
{
	m_pEvent->Lock(); //線程阻塞,直到全部的線程都被啟動,從而使所有的線程同時執(zhí)行
	PARAM *m_pParam = (PARAM*)pParam;
	int left, right;
	BOOL canDine = FALSE;
	CWnd wnd;
	CDC *pDC;
	CPen pen;
	CBrush brush, *pOldBrush;

	left = m_pParam->Id;
	right = (m_pParam->Id + 1) % PHIL_NUM;

	//檢查筷子是否可用,若可用則進餐
	m_pMutex->Lock();
	if(FALSE == chopSticks[left]
	   && FALSE == chopSticks[right])
	{
		chopSticks[left] = chopSticks[right] = TRUE;
		canDine = TRUE;
	}
	m_pMutex->Unlock();
	
	wnd.Attach(m_pParam->m_hWnd);
    pDC=wnd.GetDC();

	//根據(jù)是否可就餐畫圖
	if(TRUE == canDine)
	{
		brush.CreateSolidBrush(RGB(0, 255, 0));
		pOldBrush=(CBrush*)pDC->SelectObject(&brush);
		pDC->Ellipse(m_pParam->philX, m_pParam->philY,
					 m_pParam->philX + PHIL_DIAMETER, m_pParam->philY + PHIL_DIAMETER); 
		pen.CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
		pDC->SelectObject(&pen);
		pDC->MoveTo(m_pParam->philX + PHIL_DIAMETER/2, m_pParam->philY + PHIL_DIAMETER/2);
		pDC->LineTo(m_pParam->chopXY[2], m_pParam->chopXY[3]);
		pDC->MoveTo(m_pParam->philX + PHIL_DIAMETER/2, m_pParam->philY + PHIL_DIAMETER/2);
		pDC->LineTo(m_pParam->chopXY[6], m_pParam->chopXY[7]);
		pDC->SelectObject(pOldBrush);
	}
	else
	{
		brush.CreateSolidBrush(RGB(255, 0, 0));
		pOldBrush=(CBrush*)pDC->SelectObject(&brush);
		pDC->Ellipse(m_pParam->philX, m_pParam->philY,
					 m_pParam->philX + PHIL_DIAMETER, m_pParam->philY + PHIL_DIAMETER); 
		pDC->SelectObject(pOldBrush);
	}
	wnd.Detach();
	delete m_pParam;
	return 0L;
}


void CPhilosopherView::OnPlayMany() 
{
	// TODO: Add your command handler code here
	int i, left, right;
	int chopStartX[6], chopStartY[6], chopEndX[6], chopEndY[6];
	int philX[6], philY[6];
	PARAM *pParam = NULL;
    
	for(i = 0; i < PHIL_NUM; i++)
	{
		chopSticks[i] = FALSE;
	}

	//Finished數(shù)字的作用用來表示線程是否已經(jīng)執(zhí)行完成,用于控制“進行多次”菜單是否可以使用
	for (i =0; i< PHIL_NUM; i++)
	{
		Finished[i] = FALSE; //初始時,F(xiàn)inished為false,若線程執(zhí)行完成,F(xiàn)inished為true
	}
	m_pEvent->ResetEvent();

	CHOP_COORDINATE(150, 150);
	PHIL_COORDINATE(150, 150);
	for(i = 0; i < PHIL_NUM; i++)
	{
		pParam = new PARAM;
		if(NULL == pParam)
		{
			break;
		}
		pParam->Id = i;
		pParam->m_hWnd = this->m_hWnd;
		pParam->philX = philX[i];
		pParam->philY = philY[i];
		left = i;
		right = (i+1) % PHIL_NUM;
		pParam->chopXY[0] = chopStartX[left];
		pParam->chopXY[1] = chopStartY[left];
		pParam->chopXY[2] = chopEndX[left];
		pParam->chopXY[3] = chopEndY[left];
		pParam->chopXY[4] = chopStartX[right];
		pParam->chopXY[5] = chopStartY[right];
		pParam->chopXY[6] = chopEndX[right];
		pParam->chopXY[7] = chopEndY[right];

		m_pThread[i] = AfxBeginThread(DineMany, (LPVOID)pParam);
	}

	Invalidate();
	m_pEvent->SetEvent(); //同上的解釋
	pParam = NULL;
}

/////////////////////////////////////////////////////////////////////////////
UINT DineMany(LPVOID pParam)
{
	m_pEvent->Lock();
	PARAM *m_pParam = (PARAM*)pParam;
	int left, right;
	int TimeDelay = TIME, SleepTime;
	BOOL canDine = FALSE;
	CWnd wnd;
	CDC *pDC;
	CPen pen1, pen2, *pOldPen;
	CBrush brush1, brush2, *pOldBrush;

	left = m_pParam->Id;
	right = (m_pParam->Id + 1) % PHIL_NUM;
	
	wnd.Attach(m_pParam->m_hWnd);
    pDC=wnd.GetDC();
	brush1.CreateSolidBrush(RGB(0, 255, 0));
	brush2.CreateSolidBrush(RGB(255, 0, 0));
	pen1.CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
	pen2.CreatePen(PS_SOLID, 3, RGB(255, 255, 255));
	while(TimeDelay > 0)
	{
		m_pMutex->Lock();
		if(FALSE == chopSticks[left]
			&& FALSE == chopSticks[right])
		{
			chopSticks[left] = chopSticks[right] = TRUE;
			canDine = TRUE;
		}
		m_pMutex->Unlock();
		if(TRUE == canDine)
		{
			
			pOldBrush = (CBrush*)pDC->SelectObject(&brush1);
			pDC->Ellipse(m_pParam->philX, m_pParam->philY,
						m_pParam->philX+PHIL_DIAMETER, m_pParam->philY+PHIL_DIAMETER); 
			
			pDC->SelectObject(&pen1);
			pDC->MoveTo(m_pParam->philX+PHIL_DIAMETER/2, m_pParam->philY + PHIL_DIAMETER/2);
			pDC->LineTo(m_pParam->chopXY[2], m_pParam->chopXY[3]);
			pDC->MoveTo(m_pParam->philX + PHIL_DIAMETER/2, m_pParam->philY + PHIL_DIAMETER/2);
			pDC->LineTo(m_pParam->chopXY[6], m_pParam->chopXY[7]);
			srand((unsigned)time(NULL));
			SleepTime = ((rand() % 250 +250) - (rand() % 250 -250)) / 2;
			Sleep(SleepTime);
			TimeDelay -= SleepTime;
			if(TimeDelay < 0 ) break;

			//進餐后,防線筷子給其他哲學家使用
			m_pMutex->Lock();
			chopSticks[left] = chopSticks[right] = FALSE;
			m_pMutex->Unlock();

			//開始思考
			canDine = FALSE;
		}
		if(FALSE == canDine)
		{
			
			pOldPen = (CPen*)pDC->SelectObject(&pen2);
			pDC->MoveTo(m_pParam->philX + PHIL_DIAMETER/2, m_pParam->philY + PHIL_DIAMETER/2);
			pDC->LineTo(m_pParam->chopXY[2], m_pParam->chopXY[3]);
			pDC->MoveTo(m_pParam->philX + PHIL_DIAMETER/2, m_pParam->philY + PHIL_DIAMETER/2);
			pDC->LineTo(m_pParam->chopXY[6], m_pParam->chopXY[7]);
			pDC->SelectObject(&brush2);
			pDC->Ellipse(m_pParam->philX, m_pParam->philY,
						m_pParam->philX + PHIL_DIAMETER, m_pParam->philY + PHIL_DIAMETER);		
			pDC->SelectObject(pOldPen);

			//思考一段時間
			srand((unsigned)time(NULL));
			SleepTime = ((rand() % 500 +500) - (rand() % 500 -500)) / 2;
			Sleep(SleepTime);

			//將持續(xù)時間減去思考時間
			TimeDelay -= SleepTime;
		}
	}
	wnd.Detach();
	Finished[m_pParam->Id] = TRUE;  //線程執(zhí)行完成
	delete m_pParam;
	return 0L;
}

void CPhilosopherView::OnUpdatePlayMany(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	int i;
	BOOL flag = TRUE;
	for (i =0; i < PHIL_NUM; i++)
	{
		//若還有線程沒有執(zhí)行完成,則菜單不可用
		if (FALSE == Finished[i])
		{
			flag = FALSE;
			break;
		}
	}
	pCmdUI->Enable(flag);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美中文字幕一区二区三区亚洲| 国产精品天干天干在线综合| 成人免费视频视频在线观看免费| 日韩精品视频网站| 一区二区高清视频在线观看| 国产欧美一区二区三区在线看蜜臀| 欧美剧情电影在线观看完整版免费励志电影 | 一区二区三区视频在线观看| 久久久久久久久久美女| 日韩免费看的电影| 91精品国产品国语在线不卡| 欧美日韩亚洲高清一区二区| 在线中文字幕一区| 欧美亚洲综合色| 欧美吞精做爰啪啪高潮| 欧美日韩一区二区不卡| 色就色 综合激情| 在线观看日韩电影| 欧美少妇一区二区| 欧美视频中文一区二区三区在线观看| 91久久奴性调教| 欧美综合天天夜夜久久| 一区二区三区av电影| 亚洲国产精品影院| 奇米四色…亚洲| 国产一区二区福利视频| 国产成a人无v码亚洲福利| 国产精品白丝av| 99精品国产视频| 在线观看免费视频综合| 欧美男男青年gay1069videost| 91精品国产91久久久久久一区二区 | 中文字幕一区视频| 一区二区三区在线看| 天天综合网 天天综合色| 美女爽到高潮91| 成人免费视频app| 在线观看一区日韩| 久久嫩草精品久久久精品一| 亚洲三级免费电影| 美腿丝袜一区二区三区| 高清在线观看日韩| 欧美日韩亚洲综合一区| 久久久久久久综合| 亚洲黄色片在线观看| 韩国av一区二区| 欧美视频一区二区在线观看| 精品少妇一区二区三区| 亚洲综合激情小说| 国产精品99久久久| 7777精品伊人久久久大香线蕉经典版下载| 精品乱人伦小说| 亚洲大片免费看| 色综合av在线| 国产欧美一区二区精品性| 亚洲成人综合在线| 成人毛片在线观看| 欧美mv日韩mv| 日韩影院免费视频| 色av成人天堂桃色av| 国产精品一区一区三区| 7777女厕盗摄久久久| 亚洲精品中文在线| 99久久久无码国产精品| 久久久久久影视| 美女久久久精品| 欧美日韩国产综合草草| 亚洲日本欧美天堂| a4yy欧美一区二区三区| 久久精品一区八戒影视| 麻豆传媒一区二区三区| 欧美日韩第一区日日骚| 亚洲一区在线电影| 日本国产一区二区| 一区二区三区在线视频观看| 91丨porny丨国产入口| 国产精品短视频| 色噜噜夜夜夜综合网| 亚洲靠逼com| 欧美视频第二页| 国内成+人亚洲+欧美+综合在线| 欧美日韩黄色影视| 日韩专区一卡二卡| 337p亚洲精品色噜噜噜| 亚洲成人自拍偷拍| 欧美日韩高清影院| 日韩激情在线观看| 日韩一区二区在线观看视频| 在线成人免费视频| 韩国午夜理伦三级不卡影院| 欧美精品一区二区三区很污很色的| 奇米影视7777精品一区二区| 欧美电影精品一区二区| 国产精品性做久久久久久| 国产精品久久久久久妇女6080 | 26uuu另类欧美亚洲曰本| 国产福利精品一区二区| 亚洲人成网站精品片在线观看 | 国产精品乡下勾搭老头1| 中文字幕在线不卡国产视频| 日韩午夜电影av| 久久不见久久见免费视频7| 国产香蕉久久精品综合网| 在线免费观看一区| 97se亚洲国产综合自在线不卡| 免费观看一级特黄欧美大片| 一区二区三区精品视频| 国产欧美日韩不卡| 日韩精品一区国产麻豆| 欧美中文字幕不卡| 成年人网站91| 天天综合网 天天综合色| 日韩欧美亚洲另类制服综合在线 | 欧美激情一区不卡| 91久久精品日日躁夜夜躁欧美| 日本视频免费一区| 国产精品九色蝌蚪自拍| 欧美一区二区三区免费大片| hitomi一区二区三区精品| 蜜臀久久99精品久久久久久9 | 亚洲福中文字幕伊人影院| 国产精品自拍一区| 性做久久久久久| 国产精品素人视频| 欧美一区二区啪啪| 91成人看片片| 99久久夜色精品国产网站| 美女视频黄免费的久久| 尤物视频一区二区| 国产精品免费久久久久| 国产一区二区91| 一区二区成人在线观看| 国产视频一区二区三区在线观看| 欧美日韩国产一二三| 99久久精品免费看国产免费软件| 看电视剧不卡顿的网站| 视频在线观看91| 洋洋av久久久久久久一区| 亚洲女与黑人做爰| 亚洲欧美综合色| **欧美大码日韩| 日韩美女久久久| 国产精品国产三级国产a| 中文久久乱码一区二区| 国产精品免费观看视频| 日韩视频免费观看高清完整版在线观看 | 欧美日韩电影一区| 欧美女孩性生活视频| 欧美日韩国产成人在线91| 欧美精品tushy高清| 欧美挠脚心视频网站| 欧美不卡视频一区| 久久久国产精品不卡| 国产视频一区在线观看| 国产亚洲欧美日韩俺去了| 欧美激情一区不卡| 亚洲人成亚洲人成在线观看图片 | 国产欧美一区二区精品性| 中文一区在线播放| 亚洲综合免费观看高清在线观看| 亚洲午夜精品网| 老司机一区二区| 成人看片黄a免费看在线| 色综合久久综合中文综合网| 欧美三级在线看| 亚洲精品一线二线三线| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美日韩1区2区| 国产视频不卡一区| 国产精品免费看片| 欧美国产激情一区二区三区蜜月| 欧美日韩国产一级片| 日韩欧美你懂的| 中文一区在线播放| 亚洲香肠在线观看| 国产精品一区三区| 欧美手机在线视频| 国产无人区一区二区三区| 一区二区视频在线| 久久99国产精品成人| 色综合天天做天天爱| 欧美一区二区三区电影| 中文字幕在线免费不卡| 免费在线观看一区二区三区| 成人激情午夜影院| 日韩欧美中文字幕公布| 亚洲激情网站免费观看| 国产乱色国产精品免费视频| 欧美日韩一级二级| 国产精品免费av| 黑人巨大精品欧美黑白配亚洲| 91久久国产最好的精华液| 久久精品一区八戒影视| 蜜臀av一区二区在线免费观看 | 51精品国自产在线| 国产精品亲子乱子伦xxxx裸| 亚洲日本成人在线观看| 亚洲成人www| 91色乱码一区二区三区| 2023国产一二三区日本精品2022|