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

📄 wandr.cpp

📁 通过本程序能够实现os中经典的生产者消费者问题
💻 CPP
字号:
// WAndR.cpp : implementation file
//

#include "stdafx.h"
#include "ReaderAndWriter.h"
#include "WAndR.h"
#include "afxmt.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString str1,str2;
CString strR[20];
CString strW[20];
int ReadingNum=0;//正在读的读者数量
int WaitReader=0;//在等待的读者数
int WritingNum=0;//正在写的写者数量
int WaitWriter=0;//在等待的写者数
int RNumber=-1;//读者编号
int WNumber=-1;//写者编号
/////////////////////////////////////////////////////////////////////////////
// CWAndR dialog
UINT TReader(LPVOID pParama){
	RNumber++;
	int num;
	num=RNumber;
	num=num%20;
	
	
	int n=rand()%15+rand()%7;//读的时间
	strR[num].Format("Reader: %d          Process: %d",num,n);
	Sleep(500);

	//wsprintf(strR[RNumber],"Reader:%d    Process:%d",RNumber,n);
	while(n!=0){
		n--;
		strR[num].Format("Reader: %d          Process: %d",num,n);
		Sleep(500);
		
	}
	//if(n==0)
	//str[RNumber]=//////////////////////;
	if(n==0){
		strR[num].Format("%d",n);
	}
	ReadingNum--;
	if(ReadingNum<=0){
		ReadingNum=0;
	}
	return 0;
}
UINT TWriter(LPVOID pParama){
	WNumber++;
	int num;
	num=WNumber;
	num=num%20;
	int n=rand()%15+rand()%5;//写的时间
	strW[num].Format("Writer: %d          Process: %d",num,n);
	Sleep(500);
	//wsprintf(strW[WNumber],"Reader:%d    Process:%d",WNumber,n);
	while(n!=0){
		n--;
		strW[num].Format("Writer: %d          Process: %d",num,n);
		Sleep(500);
	}
	if(n==0){
		strW[num].Format("%d",n);
	}
	WritingNum--;
	if(WritingNum<=0){
		WritingNum=0;
	}
	return 0;
}

UINT TCPU(LPVOID pParama){
	if(WaitReader>0&&WritingNum==0&&WaitWriter==0){
			WaitReader--;
			ReadingNum++;
			AfxBeginThread(TReader,(LPVOID)ReadingNum);
	}
	else if(WaitWriter>0&&ReadingNum==0&&WritingNum==0){	
		WaitWriter--;
		WritingNum++;
		AfxBeginThread(TWriter,(LPVOID)WritingNum);
		
	}
	str1="";
	str2="";
	for(int i=0;i<20;i++){
		if(strR[i]!="0")
			str1=str1+strR[i]+'\r'+'\n';
		if(strW[i]!="0")
			str2=str2+strW[i]+'\r'+'\n';
	}
	return 0;
}
CWAndR::CWAndR(CWnd* pParent /*=NULL*/)
	: CDialog(CWAndR::IDD, pParent)
{
	//{{AFX_DATA_INIT(CWAndR)
	m_strReaders = _T("");
	m_strWriters = _T("");
	m_WaitingW = 0;
	m_WaitingR = 0;
	//}}AFX_DATA_INIT
	//SetTimer(1,50,NULL);
	ReadingNum=0;//正在读的读者数量
WaitReader=0;//在等待的读者数
 WritingNum=0;//正在写的写者数量
 WaitWriter=0;//在等待的写者数
 RNumber=0;//读者编号
 WNumber=0;//写者编号
}


void CWAndR::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CWAndR)
	DDX_Text(pDX, IDC_EDIT_READERS, m_strReaders);
	DDX_Text(pDX, IDC_EDIT_WRITERS, m_strWriters);
	DDX_Text(pDX, IDC_EDIT_WAITINGW, m_WaitingW);
	DDX_Text(pDX, IDC_EDIT_WAiTINGR, m_WaitingR);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CWAndR, CDialog)
	//{{AFX_MSG_MAP(CWAndR)
	ON_BN_CLICKED(IDC_BUTTON_ADDREADER, OnButtonAddreader)
	ON_BN_CLICKED(IDC_BUTTON_ADDWRITER, OnButtonAddwriter)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWAndR message handlers

void CWAndR::OnButtonAddreader() 
{
	// TODO: Add your control notification handler code here
	Sleep(100);
	SetTimer(1,200,NULL);
	if(WaitReader>=10){
		MessageBox("not allow enter now!");
		return;
	}
	WaitReader++;
	if(WritingNum==0&&WaitWriter==0){
			WaitReader--;
			ReadingNum++;
			AfxBeginThread(TReader,"R");
	}
	m_WaitingR=WaitReader;
	UpdateData(FALSE);
}

void CWAndR::OnButtonAddwriter() 
{
	// TODO: Add your control notification handler code here
	Sleep(100);
	SetTimer(1,200,NULL);
	if(WaitWriter>=10){
		MessageBox("not allow enter now!");
		return;
	}
	WaitWriter++;	
	if(ReadingNum==0&&WritingNum==0){
		WaitWriter--;
		WritingNum++;
		AfxBeginThread(TWriter,"W");
	}
	m_WaitingW=WaitWriter;
	UpdateData(FALSE);
}

void CWAndR::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	AfxBeginThread(TCPU,"CPU");
	m_WaitingR=WaitReader;
	m_WaitingW=WaitWriter;
	m_strWriters=str2;
	m_strReaders=str1;
	UpdateData(FALSE);
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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