📄 rwerdlg.cpp
字号:
(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)¶m[i],THREAD_PRIORITY_HIGHEST);
if(buffer[i].type==1)
m_pThread[i]=AfxBeginThread((AFX_THREADPROC)WriteProc,(LPVOID)(¶m[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)¶m[i], THREAD_PRIORITY_LOWEST);
if(buffer[i].type==1)
m_pThread[i]=AfxBeginThread((AFX_THREADPROC)WriteProc,(LPVOID)(¶m[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 + -