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

📄 rwerdlg.cpp

📁 读者写者有限的问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		(CEdit*)GetDlgItem(IDC_EDIT05)->ShowWindow(SW_SHOW);
		(CEdit*)GetDlgItem(IDC_EDIT15)->ShowWindow(SW_SHOW);
		(CComboBox*)GetDlgItem(IDC_COMBO5)->ShowWindow(SW_SHOW);
		(CStatic*)GetDlgItem(IDC_STATIC5)->ShowWindow(SW_SHOW);
	case 4:
		(CEdit*)GetDlgItem(IDC_EDIT04)->ShowWindow(SW_SHOW);
		(CEdit*)GetDlgItem(IDC_EDIT14)->ShowWindow(SW_SHOW);
		(CComboBox*)GetDlgItem(IDC_COMBO4)->ShowWindow(SW_SHOW);
		(CStatic*)GetDlgItem(IDC_STATIC4)->ShowWindow(SW_SHOW);
	case 3:
		(CEdit*)GetDlgItem(IDC_EDIT03)->ShowWindow(SW_SHOW);
		(CEdit*)GetDlgItem(IDC_EDIT13)->ShowWindow(SW_SHOW);
		(CComboBox*)GetDlgItem(IDC_COMBO3)->ShowWindow(SW_SHOW);
		(CStatic*)GetDlgItem(IDC_STATIC3)->ShowWindow(SW_SHOW);
	case 2:	
		(CEdit*)GetDlgItem(IDC_EDIT02)->ShowWindow(SW_SHOW);
		(CEdit*)GetDlgItem(IDC_EDIT12)->ShowWindow(SW_SHOW);
		(CComboBox*)GetDlgItem(IDC_COMBO2)->ShowWindow(SW_SHOW);
		(CStatic*)GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);
	case 1:
		(CEdit*)GetDlgItem(IDC_EDIT01)->ShowWindow(SW_SHOW);
		(CEdit*)GetDlgItem(IDC_EDIT11)->ShowWindow(SW_SHOW);
		(CComboBox*)GetDlgItem(IDC_COMBO1)->ShowWindow(SW_SHOW);
		(CStatic*)GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);break;
	default:
		AfxMessageBox("传数错误!");
	}

}

void CCustomizeDialog::enableCtrl(int nCount)
{
	switch(nCount)
	{
	case 1:/*(CEdit*)GetDlgItem(IDC_EDIT02)->EnableWindow(FALSE);
	(CEdit*)GetDlgItem(IDC_EDIT12)->EnableWindow(FALSE);
	(CComboBox*)GetDlgItem(IDC_COMBO2)->EnableWindow(FALSE);
	(CStatic*)GetDlgItem(IDC_STATIC2)->EnableWindow(FALSE);*/
		(CEdit*)GetDlgItem(IDC_EDIT02)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT12)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO2)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);
	case 2:
		(CEdit*)GetDlgItem(IDC_EDIT03)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT13)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO3)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC3)->ShowWindow(SW_HIDE);
	case 3:
		(CEdit*)GetDlgItem(IDC_EDIT04)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT14)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO4)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC4)->ShowWindow(SW_HIDE);
	case 4:
		(CEdit*)GetDlgItem(IDC_EDIT05)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT15)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO5)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC5)->ShowWindow(SW_HIDE);
	case 5:
		(CEdit*)GetDlgItem(IDC_EDIT06)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT16)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO6)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC6)->ShowWindow(SW_HIDE);
	case 6:
		(CEdit*)GetDlgItem(IDC_EDIT07)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT17)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO7)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC7)->ShowWindow(SW_HIDE);
	case 7:
		(CEdit*)GetDlgItem(IDC_EDIT08)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT18)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO8)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC8)->ShowWindow(SW_HIDE);
	case 8:
		(CEdit*)GetDlgItem(IDC_EDIT09)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT19)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO9)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC9)->ShowWindow(SW_HIDE);
	case 9:
		(CEdit*)GetDlgItem(IDC_EDIT10)->ShowWindow(SW_HIDE);
		(CEdit*)GetDlgItem(IDC_EDIT20)->ShowWindow(SW_HIDE);
		(CComboBox*)GetDlgItem(IDC_COMBO10)->ShowWindow(SW_HIDE);
		(CStatic*)GetDlgItem(IDC_STATIC10)->ShowWindow(SW_HIDE);
		break;
	case 10:break;
	default:
		AfxMessageBox("传数错误!");
	}

}

void CCustomizeDialog::OnChangeThreadCount() 
{
	// TODO: If this is a RICHEDIT control, the control will not
    //UpdateData();
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	
}

void CCustomizeDialog::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData();
	if(m_threadCount<=0||m_threadCount>10)
		AfxMessageBox("请输入1--10之间的整数!");
	else 
		{
			disableCtrl(m_threadCount);
			enableCtrl(m_threadCount);
		}	
	CDialog::OnLButtonDown(nFlags, point);
}
	
void CCustomizeDialog::OnSelchangeCombo1() 
{
	// TODO: Add your control notification handler code here
	int i=m_tpye1.GetCurSel();
	//semaphore.threadInformation.Add(i);
}



void CCustomizeDialog::OnOK() 
{
	// TODO: Add extra validation here
	UpdateData();
	viewtobuffer(buffer,m_threadCount);
	CDialog::OnOK();
}

void CCustomizeDialog::viewtobuffer(TEST *buffer, int m_threadCount)
{
	for(int i=0;i<m_threadCount;i++)
		buffer[i].index=i+1;
	buffer[i].index=0;
	buffer[10].TStart=m_threadCount;
	UpdateData();
	switch(m_threadCount)
	{
	case 10:
		buffer[9].TContinu=m_continu10;
		buffer[9].TStart=m_start10;
		buffer[9].type=m_type10.GetCurSel();
	case 9:
		buffer[8].TContinu=m_continu9;
		buffer[8].TStart=m_start9;
		buffer[8].type=m_type9.GetCurSel();
	case 8:
		buffer[7].TContinu=m_continu8;
		buffer[7].TStart=m_start8;
		buffer[7].type=m_type8.GetCurSel();
	case 7:
		buffer[6].TContinu=m_continu7;
		buffer[6].TStart=m_start7;
		buffer[6].type=m_type7.GetCurSel();
	case 6:
		buffer[5].TContinu=m_continu6;
		buffer[5].TStart=m_start6;
		buffer[5].type=m_type6.GetCurSel();
	
	case 5:
		buffer[4].TContinu=m_continu5;
		buffer[4].TStart=m_start5;
		buffer[4].type=m_type5.GetCurSel();
	case 4:
		buffer[3].TContinu=m_continu4;
		buffer[3].TStart=m_start4;
		buffer[3].type=m_type4.GetCurSel();
	case 3:
		buffer[2].TContinu=m_continu3;
		buffer[2].TStart=m_start3;
		buffer[2].type=m_type3.GetCurSel();
	case 2:	
		buffer[1].TContinu=m_continu2;
		buffer[1].TStart=m_start2;
		buffer[1].type=m_type2.GetCurSel();
	case 1:
		buffer[0].TContinu=m_continu1;
		buffer[0].TStart=m_start1;
		buffer[0].type=m_tpye1.GetCurSel();
		break;
	default:
		AfxMessageBox("传数错误!");
	}

}

void CCustomizeDialog::OnKillfocusThreadCount() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	if(m_threadCount<=0||m_threadCount>10)
		AfxMessageBox("请输入1--10之间的整数!");
	else 
		{
			disableCtrl(m_threadCount);
			enableCtrl(m_threadCount);
		}	
}


void CRWerDlg::filetobuffer(CString pathname, TEST buffer[])
{
	int strlength=pathname.GetLength();
	char* name=new char[strlength+1];
	for(int i=0;i<strlength;i++)
		name[i]=pathname[i];
		name[i]=0;
	CFile file(name,CFile::modeRead);
	delete name;
	int len;
	file.Read(&len,sizeof(len));buffer[10].TStart=len;//总线程数
	for(i=0;i<len;i++)
	{
		file.Read((void *)&buffer[i].index,sizeof(buffer[i].index));
		file.Read((void*)&buffer[i].type,sizeof(buffer[i].type));
		file.Read((void*)&buffer[i].TContinu,sizeof(buffer[i].TContinu));
		file.Read((void*)&buffer[i].TStart,sizeof(buffer[i].TStart));
	}
	file.Close();

}
////////////////////////////////////////////////////////

void CRWerDlg::OnLoad() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	if(m_pMaxNumSemaphore)
	{	//创建最多容纳读者信号量		
		m_pMaxNumSemaphore=new CSemaphore(m_Rmax+1,m_Rmax+1);		
	}
	GetDlgItem(IDC_START)->EnableWindow(TRUE);
	GetDlgItem(IDC_LOAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_CUSTOMIZE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BROWSE)->EnableWindow(FALSE);
	//m_preadResource=
//		(readResource*)AfxBeginThread(RUNTIME_CLASS(readResource));
	if(m_listBox.GetCount())
		OnClear();
	Rcount=0;Wcount=0;s=0;
	Rtemp=0;Wtemp=0;finish=0;	
	setInit();//b把控件状态初始化
	UpdateData();UpdateData(FALSE);//m_OpenMutex.Lock();//m_OpenMutex;//开诊状态互斥量
	//m_bOpen=TRUE;
	//m_OpenMutex.Unlock();	
}

void CRWerDlg::OnStart() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_START)->EnableWindow(FALSE);
	GetDlgItem(IDC_LOAD)->EnableWindow(FALSE);
	GetDlgItem(IDC_CUSTOMIZE)->EnableWindow(FALSE);
	GetDlgItem(IDC_BROWSE)->EnableWindow(FALSE);
	UpdateData();UpdateData(FALSE);
	SYSTEMTIME tim;GetLocalTime(&tim);CTimeSpan cur(tim.wDay,tim.wHour,tim.wMinute,tim.wSecond);
	ST=cur.GetTotalSeconds();
	for(int i=0;i<totalThread;i++)
	{
		param[i].hwnd=this;
		param[i].infor=&buffer[i];
	}
	if(m_write_priority==1)
	for(i=0;i<totalThread;i++)
	{
		if(buffer[i].type==0)
			m_pThread[i]=AfxBeginThread((AFX_THREADPROC)ReadProc,(LPVOID)&param[i],THREAD_PRIORITY_HIGHEST);
		if(buffer[i].type==1)
			m_pThread[i]=AfxBeginThread((AFX_THREADPROC)WriteProc,(LPVOID)(&param[i]),THREAD_PRIORITY_LOWEST);
	}
	if(m_write_priority==0)
		for(i=0;i<totalThread;i++)
	{
		if(buffer[i].type==0)
			m_pThread[i]=AfxBeginThread((AFX_THREADPROC)ReadProc,(LPVOID)&param[i], 	THREAD_PRIORITY_LOWEST);
		if(buffer[i].type==1)
			m_pThread[i]=AfxBeginThread((AFX_THREADPROC)WriteProc,(LPVOID)(&param[i]), 	THREAD_PRIORITY_HIGHEST);
	}
}

void CRWerDlg::addListBox(int type,int id)
{
	SYSTEMTIME tim;CString str;GetLocalTime(&tim);CTimeSpan cur(tim.wDay,tim.wHour,tim.wMinute,tim.wSecond);
	LONG TIME=cur.GetTotalSeconds();
	switch(type)
	{
	case 1:
		str.Format("[%2d秒时]:  读者%d线程创建",TIME-ST,id);break;			
	case 2:
		str.Format("[%2d秒时]:  读者%d发出读操作申请",TIME-ST,id);break;		
	case 3:
		str.Format("[%2d秒时]:  读者%d申请到资源了,开始读操作",TIME-ST,id);break;		
	case 4:
		str.Format("[%2d秒时]:  读者%d结束读操作并释放资源",TIME-ST,id);break;		
	case 5:
		str.Format("[%2d秒时]:  写者%d线程创建",TIME-ST,id);break;		
	case 6:
		str.Format("[%2d秒时]:  写者%d发出写操作申请",TIME-ST,id);break;		
	case 7:
		str.Format("[%2d秒时]:  写者%d申请到资源了,开始写操作",TIME-ST,id);break;	
	case 8:
		str.Format("[%2d秒时]:  写者%d结束读写操作并释放资源",TIME-ST,id);break;		
	}
	listMutex.Lock();
	m_listBox.AddString(str);
	listMutex.Unlock();
}


void CRWerDlg::getRWtotal(int &r, int &w)
{
	r=w=0;
	for(int i=0;buffer[i].index!=0;i++)
	{
		if(buffer[i].type==0)r++;
		if(buffer[i].type==1)w++;
	}
}

void CRWerDlg::OnOK() 
{
	// TODO: Add extra validation here
		RcountMutex.Lock();writeMutex.Lock();
	//if(Rcount!=0||Wcount!=0)
	DWORD dwCode[11];
	for(int i=0;i<totalThread;i++)
	if(m_pThread[i]&&GetExitCodeThread(m_pThread[i]->m_hThread,&dwCode[i]))
	{
		if(dwCode[i]==STILL_ACTIVE)
		{
			TerminateThread(m_pThread[i]->m_hThread,0);
			CloseHandle(m_pThread[i]->m_hThread);
			m_pThread[i]=NULL;
		}
	}
	
	writeMutex.Unlock();
	RcountMutex.Unlock();
	delete m_pMaxNumSemaphore;
	CDialog::OnOK();
}

void CRWerDlg::setInit()
{
	CString str;
	str.Format("%d",readTotal);
	GetDlgItem(IDC_R_TOTAL)->SetWindowText(str);
	str.Format("%d",writeTotal);
	GetDlgItem(IDC_W_TOTAL)->SetWindowText(str);	
	str.Format("%d",Rwait=readTotal);
	GetDlgItem(IDC_R_WAIT)->SetWindowText(str);
	str.Format("%d",Wwait=writeTotal);
	GetDlgItem(IDC_W_WAIT)->SetWindowText(str);
	str.Format("%d",Rcount);
	GetDlgItem(IDC_READING)->SetWindowText(str);
	str.Format("%d",Wcount);
	GetDlgItem(IDC_WITING)->SetWindowText(str);
	str.Format("%d",Rtemp);
	GetDlgItem(IDC_rFINISHED)->SetWindowText(str);
	str.Format("%d",Wtemp);
	GetDlgItem(IDC_wFINISHED)->SetWindowText(str);		

}

/*void CRWerDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	RcountMutex.Lock();	
	writeMutex.Lock();
	if(Rcount==0&&Wcount==0)
	{
		KillTimer(nIDEvent);
		::AfxMessageBox("所有线程都已运行完毕!");

		GetDlgItem(IDC_START)->EnableWindow(FALSE);
		GetDlgItem(IDC_LOAD)->EnableWindow(TRUE);
		GetDlgItem(IDC_CUSTOMIZE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BROWSE)->EnableWindow(TRUE);
		//delete m_pMaxNumSemaphore;
	}
	RcountMutex.Unlock();	
	writeMutex.Unlock();
	CDialog::OnTimer(nIDEvent);
}*/

void CRWerDlg::OnClear() 
{
	// TODO: Add your control notification handler code here
	if(MessageBox("下面将清空列表框,是否保存?","提示!",MB_OKCANCEL)==1)
	{
		OnSave();
	}
	m_listBox.ResetContent();
	
}

void CRWerDlg::OnSave() 
{
	// TODO: Add your control notification handler code herebuffer[10].TStart
 if(m_listBox.GetCount())
 {
	 CString a="",b="线程号   类  型    开始时间    持续时间 \r\n";
	for(int i=0;i<totalThread;i++)
	{
		if(buffer[i].type==0)
			a.Format("%6d   READER   %8d   %8d\r\n",
			buffer[i].index,buffer[i].TStart,buffer[i].TContinu);
		else 
		a.Format("%6d   WRITER   %8d   %8d\r\n",
			buffer[i].index,buffer[i].TStart,buffer[i].TContinu);		
		b=b+a;
	}
	if(m_write_priority==0)b=b+"写者优先\r\n";
		else b=b+"读者优先\r\n";
	 CString str="";	 
	 CString data=b;
	 data="测试数据:\r\n"+data+"\r\n\r\n运行过程:\r\n";
	char tem[50];
	int len=m_listBox.GetCount();
	for( i=0;i<len;i++)
	{
		m_listBox.GetText(i,tem);	
		str=str+tem+"\r\n";		
	}
	CFileDialog dlg(false);
		dlg.m_ofn.lpstrFilter="运行结果(*.txt)\0*.txt\0\0";
		dlg.m_ofn.lpstrInitialDir=".";
		//dlg.m_ofn.Flags=
		if(dlg.DoModal()==IDOK)
		{
			m_pathName=dlg.GetPathName();
			if(m_pathName.Right(4)!=".txt")
				m_pathName=dlg.GetPathName()+".txt";								
			CFile file(m_pathName,CFile::modeCreate|CFile::modeWrite);//CFile::modeRead
			str=data+str;
			file.Write(str,str.GetLength());	
			file.Close();
			a="保存完毕,请到"+m_pathName+"处查看!";
			AfxMessageBox(a);
		}
 }
 else ::AfxMessageBox("框中记录为空!");
		

}
void CRWerDlg::finished()
{
	AfxMessageBox("所有线程都已运行完毕!");//(CWnd*)
	GetDlgItem(IDC_LOAD)->EnableWindow(TRUE);
	GetDlgItem(IDC_BROWSE)->EnableWindow(TRUE);
	GetDlgItem(IDC_CUSTOMIZE)->EnableWindow(TRUE);
}

void CRWerDlg::data2text(CString name)
{
	CString a="",b="";char c;
	for(int i=0;i<buffer[10].TStart;i++)
	{
		if(buffer[i].type==0)c='r';else c='w';
		a.Format("线程%d 类型%a 开始时间%d 持续时间%d",
			buffer[i].index,c,buffer[i].TStart,buffer[i].TContinu);
		a=a+"ad";
		a.SetAt(a.GetLength()-2,'\n');
		a.SetAt(a.GetLength()-1,'\r');
		b=b+a;
	}
	name=b;
}

⌨️ 快捷键说明

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