📄 itoseedoctor.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 + -