⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 itoseedoctor.cpp

📁 本书分为五个部分
💻 CPP
字号:
// ItoSeeDoctor.cpp文件

#include "stdafx.h"
#include "S08_03.h"
#include "S08_03Dlg.h"
#include "ItoSeeDoctor.h"

UINT ItoSeeDoctor(LPVOID pParam)
{
	// 以CS08_03Dlg对象指针为参数
	CS08_03Dlg *pDlg = (CS08_03Dlg*)pParam;
	try
	{
		// 下面经常将“我”看病的经历写到m_MyRecord列表框中
		pDlg->m_MyRecord.AddString( "我去看病了!" );
		pDlg->m_MyRecord.AddString( "先看看开门了没有..." );
		// 开始设置“我”等待就诊标志
		pDlg->m_MyStateMutex.Lock();
		pDlg->m_nMyState = 1;
		pDlg->m_MyStateMutex.Unlock();
		// 判断医院是否开诊
		pDlg->m_OpenMutex.Lock();
		if( !pDlg->m_bOpen )
		{
			pDlg->m_OpenMutex.Unlock();
			throw "来早了,医院还没有开门!先回去吧!";
		}
		pDlg->m_OpenMutex.Unlock();
		pDlg->m_MyRecord.AddString( "还好,开门了,等待..." );
		// 看医院是否还有能力接待“我”,在1000ms内等待
		if( !pDlg->m_pMaxNumSemaphore->Lock(1000) )
			throw "等了这么久,也没空!不等了!";
		// 等到了,开始看病,设置标志
		pDlg->m_MyStateMutex.Lock();
		pDlg->m_nMyState = 2;
		pDlg->m_MyStateMutex.Unlock();
		// 向医院线程发送“我”就诊的消息
		pDlg->m_pHospitalThread->PostThreadMessage( WM_MY_SEE_START, NULL, NULL );
		pDlg->m_MyRecord.AddString( "我正在看病..." );
		// 用随机数作为看病所耗的时间
		srand( (unsigned)time( NULL ) );
		int nTemp = rand() % 5000 + 1;
		// 等待看病结束
		// 等待
		Sleep( nTemp );
		CString str;
		str.Format( "花了我宝贵的 %d 毫秒时间!", nTemp );
		pDlg->m_MyRecord.AddString( str );
		// 看完病,付款准备离开(用随机数作为付款额)
		nTemp = rand() % 1000 + 1;
		// 向医院线程发送“我”看完病的消息
		pDlg->m_pHospitalThread->PostThreadMessage( WM_MY_SEE_END,nTemp, NULL );
		str.Format( "我看完病了,花了 %d 元钱。", nTemp );
		pDlg->m_MyRecord.AddString( str );
		// 让出所占医院就诊能力的信号量
		pDlg->m_pMaxNumSemaphore->Unlock();
		// 看完病设置标志
		pDlg->m_MyStateMutex.Lock();
		pDlg->m_nMyState = 3;
		pDlg->m_MyStateMutex.Unlock();
		pDlg->m_MyRecord.AddString( "不错,病看完了,我回家了" );
		throw "再见!";
	}
	catch( char *str )
	{
		// 处理上面不管什么原因,线程执行终止
		// 输出退出信息
		pDlg->m_MyRecord.AddString( str );
		// 允许我再来看病
		pDlg->GetDlgItem( IDC_BUTTON3 )->EnableWindow( TRUE );
		// 恢复设置我的状态
		pDlg->m_MyStateMutex.Lock();
		pDlg->m_nMyState = 0;
		pDlg->m_MyStateMutex.Unlock();
		// 退出
		AfxEndThread( 0 );
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -