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

📄 mfcview.cpp

📁 简单的水塔供水系统的模拟
💻 CPP
字号:
// MFCView.cpp : implementation of the CMFCView class
//

#include "stdafx.h"
#include "MFC.h"
#include <afxmt.h>
#include "MFCDoc.h"
#include "MFCView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMFCView

IMPLEMENT_DYNCREATE(CMFCView, CFormView)

BEGIN_MESSAGE_MAP(CMFCView, CFormView)
	//{{AFX_MSG_MAP(CMFCView)
	ON_BN_CLICKED(ID_START, OnStart)
	ON_WM_TIMER()
	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN1, OnDeltaposSpin1)
	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN2, OnDeltaposSpin2)
	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN3, OnDeltaposSpin3)
	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN4, OnDeltaposSpin4)
	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN5, OnDeltaposSpin5)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMFCView construction/destruction
struct SharedData
{
	int  cistern; 				// 用于表示水塔的蓄水池。补水线程WaterAffusing 
								// 向链表m_Cistern的头部插入元素模拟向蓄水池中
								// 补水;用水线程WaterUsing从链表m_Cistern的尾
								// 部删除元素模拟从蓄水池中放水使用。
CCriticalSection criticalSect;	// 用于线程之间对共享链表cistern访问的同步的临界
								// 区成员。
	int userFlux[5];		    // 用于存放各个用户的用水流量。这些流量值是动态
								// 变化的,因此它们应该与调节用户用水流量的控件
								// 相关联,实现数据的动态交换。注意,该数组的元
								// 素个数取决于用户的个数,这里假设用户为5。
	int affuseFlux;			    // 补水流量。
} m_SharedData;	
int Current;
const int MaxWater = 100;
int CurrentUserWater = 0;
bool Break = false;
bool bushui = false;
bool START;
UINT WaterAffusing(LPVOID pParam)//bushui
{
	CSingleLock singleLock(&m_SharedData.criticalSect);
	while(START)
	{
		singleLock.Lock();  		// Attempt to lock the shared resource
		if (singleLock.IsLocked())  	// Resource has been locked
		{
			//...use the shared resource...
			if( !Break )
			{
				if(m_SharedData.cistern <= 50 && m_SharedData.cistern>=0 )
				{//真实蓄水量在0-50时,开始启动补水装置
					bushui = true;		
				}
				if(bushui)
				{
					m_SharedData.affuseFlux = CurrentUserWater +2;
					if( m_SharedData.cistern > 70 && m_SharedData.affuseFlux !=0 )
					{
						if(m_SharedData.cistern < 100)
						{
							m_SharedData.affuseFlux = CurrentUserWater + 1;
						}
						else
						{
							m_SharedData.affuseFlux = 0;
							m_SharedData.cistern = MaxWater;
							bushui = false;
						}
						m_SharedData.cistern = 	m_SharedData.cistern + m_SharedData.affuseFlux;
					}
					else
					{
						m_SharedData.cistern = 	m_SharedData.cistern + m_SharedData.affuseFlux;			
					}
				}
			}
			singleLock.Unlock();
			Sleep(100);
		}
	}
	return 0; // ends the thread
}
UINT WaterUsing(LPVOID pParam)//yongshui
{
	CSingleLock singleLock(&m_SharedData.criticalSect);
	while(START)
	{
		singleLock.Lock();  		// Attempt to lock the shared resource
		if (singleLock.IsLocked())  	// Resource has been locked
		{
			//...use the shared resource...
			if(!Break)
			{
				if(m_SharedData.cistern <= MaxWater)
				{
					m_SharedData.cistern = m_SharedData.cistern - CurrentUserWater;
				}
			}
			if(Break)
			{
				if(	m_SharedData.cistern - CurrentUserWater < 0 )
				{
					m_SharedData.cistern = 0;
					CurrentUserWater = 0;
				}
				else
				{
					m_SharedData.cistern = m_SharedData.cistern - CurrentUserWater;
				}
			}
			singleLock.Unlock();
			Sleep(100);
		}
	}
	return 0; // ends the thread
}
CMFCView::CMFCView()
	: CFormView(CMFCView::IDD)
{
	//{{AFX_DATA_INIT(CMFCView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CMFCView::~CMFCView()
{
}

void CMFCView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMFCView)
	//}}AFX_DATA_MAP
}

BOOL CMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void CMFCView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	for(int i = 0;i<5;i++)
	{
		m_SharedData.userFlux[i] = 0;
	}
	m_SharedData.cistern = 0;
	SetDlgItemText(IDC_EDIT1,"0");
	SetDlgItemText(IDC_EDIT2,"0");
	SetDlgItemText(IDC_EDIT3,"0");
	SetDlgItemText(IDC_EDIT4,"0");
	SetDlgItemText(IDC_EDIT5,"0");
	GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
	START = false;
}

/////////////////////////////////////////////////////////////////////////////
// CMFCView printing

BOOL CMFCView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CMFCView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// CMFCView diagnostics

#ifdef _DEBUG
void CMFCView::AssertValid() const
{
	CFormView::AssertValid();
}

void CMFCView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CMFCDoc* CMFCView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCDoc)));
	return (CMFCDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMFCView message handlers

void CMFCView::OnStart() 
{
	// TODO: Add your command handler code here
	CString str;
	if(!START)
	{	
		START = true;
		GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
		SetDlgItemText(ID_START,"系统关闭");
		m_nTimer = SetTimer(1, 150, NULL); // 1/10 second
		ASSERT(m_nTimer != 0);
		AfxBeginThread(WaterUsing, GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
		AfxBeginThread(WaterAffusing, GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
	}
	else
	{
		GetDlgItemText(ID_START,str);
		if(strcmp(str,"关闭中...") == 0 )
			return;
		GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
		SetDlgItemText(ID_START,"关闭中...");
		GetDlgItem(ID_START)->EnableWindow(FALSE);
		SetDlgItemText(IDC_STATIC,"为保证设备安全关\n闭,正在抽取池中\n剩余的水.....");
		SetDlgItemText(IDC_EDIT_YONGSHUI,"0");
		SetDlgItemText(IDC_EDIT_BUSHUI,"0");
		Break = true;
		START = false;
	}
}
void CMFCView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CProgressCtrl* pBarbushui = (CProgressCtrl*) GetDlgItem(IDC_PRO_BUSHUI);
	CProgressCtrl* pBarxushui = (CProgressCtrl*) GetDlgItem(IDC_PRO_XUSHUI);
	CProgressCtrl* pBaryongshui = (CProgressCtrl*) GetDlgItem(IDC_PRO_YONGSHUI);
	CString str;
	int i;
	GetDlgItemText(ID_START,str);
	if( strcmp(str,"关闭中...") == 0 )
	{
		m_SharedData.affuseFlux = 0;
		CurrentUserWater = 0;
	}

	pBarxushui->SetPos(m_SharedData.cistern);

	pBarbushui->SetPos(m_SharedData.affuseFlux * 4);
	str.Format("%d",m_SharedData.affuseFlux);
	SetDlgItemText(IDC_EDIT_BUSHUI,str);

	pBaryongshui->SetPos(CurrentUserWater * 5);
	str.Format("%d",CurrentUserWater);
	SetDlgItemText(IDC_EDIT_YONGSHUI,str);

	GetDlgItemText(ID_START,str);
	if( strcmp(str,"关闭中...") == 0 )
	{	
		Current = m_SharedData.cistern;
		m_SharedData.cistern = 0;
	}

	if( m_SharedData.cistern == 0 && Break )
	{
		for( i = 0; i < 5; i++ )
		{
			m_SharedData.userFlux[i] = 0;
		}
		CProgressCtrl* pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO1);
		pBar->SetPos(0);
		pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO2);
		pBar->SetPos(0);
		pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO3);
		pBar->SetPos(0);
		pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO4);
		pBar->SetPos(0);
		pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO5);
		pBar->SetPos(0);
		SetDlgItemText(IDC_EDIT1,"0");
		SetDlgItemText(IDC_EDIT2,"0");
		SetDlgItemText(IDC_EDIT3,"0");
		SetDlgItemText(IDC_EDIT4,"0");
		SetDlgItemText(IDC_EDIT5,"0");
	}

	if( strcmp(str,"关闭中...") == 0 )
	{
		while(Current > 0)
		{
			str.Format("%d",Current);
			pBarxushui->SetPos(--Current);
			Sleep(100);
		}
		SetDlgItemText(IDC_STATIC,"成功关闭!!");
		Sleep(1000);
		GetDlgItem(ID_START)->EnableWindow(TRUE);
		SetDlgItemText(ID_START,"系统启动");
		Break = false;
		SetDlgItemText(IDC_STATIC,"");
		KillTimer(1);
	}
	//CFormView::OnTimer(nIDEvent);
}

void CMFCView::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	if( m_SharedData.cistern == 0)
		return;
	if( pNMUpDown->iDelta == -1 )
	{
		if( m_SharedData.userFlux[0] == 4 )
		{
			m_SharedData.userFlux[0] = 4;
		}
		else
		{
			m_SharedData.userFlux[0]++;
		}
	}
	if( pNMUpDown->iDelta == 1 )
	{
		if( m_SharedData.userFlux[0] == 0 )
		{
			m_SharedData.userFlux[0] = 0;
		}
		else
		{
			m_SharedData.userFlux[0]--;
		}
	}
	if(CurrentUserWater !=0)
	{
		CurrentUserWater = 0;
	}
	for(int i = 0;i < 5; i++)
	{
		CurrentUserWater = m_SharedData.userFlux[i] + CurrentUserWater;
	}
	CProgressCtrl* pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO1);
	pBar->SetPos(m_SharedData.userFlux[0]*25);
	CString str;
	str.Format("%d",m_SharedData.userFlux[0]);
	SetDlgItemText(IDC_EDIT1,str);
	*pResult = 0;
}

void CMFCView::OnDeltaposSpin2(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	if( m_SharedData.cistern == 0)
		return;
	if( pNMUpDown->iDelta == -1 )
	{
		if( m_SharedData.userFlux[1] == 4 )
		{
			m_SharedData.userFlux[1] = 4;
		}
		else
		{
			m_SharedData.userFlux[1]++;
		}
	}
	if( pNMUpDown->iDelta == 1 )
	{
		if( m_SharedData.userFlux[1] == 0 )
		{
			m_SharedData.userFlux[1] = 0;
		}
		else
		{
			m_SharedData.userFlux[1]--;
		}
	}
	if(CurrentUserWater !=0)
	{
		CurrentUserWater = 0;
	}
	for(int i = 0;i < 5; i++)
	{
		CurrentUserWater = m_SharedData.userFlux[i] + CurrentUserWater;
	}
	CProgressCtrl* pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO2);
	pBar->SetPos(m_SharedData.userFlux[1]*25);
	CString str;
	str.Format("%d",m_SharedData.userFlux[1]);
	SetDlgItemText(IDC_EDIT2,str);	
	*pResult = 0;
}

void CMFCView::OnDeltaposSpin3(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	if( m_SharedData.cistern == 0)
		return;
	if( pNMUpDown->iDelta == -1 )
	{
		if( m_SharedData.userFlux[2] == 4 )
		{
			m_SharedData.userFlux[2] = 4;
		}
		else
		{
			m_SharedData.userFlux[2]++;
		}
	}
	if( pNMUpDown->iDelta == 1 )
	{
		if( m_SharedData.userFlux[2] == 0 )
		{
			m_SharedData.userFlux[2] = 0;
		}
		else
		{
			m_SharedData.userFlux[2]--;
		}
	}
	if(CurrentUserWater !=0)
	{
		CurrentUserWater = 0;
	}
	for(int i = 0;i < 5; i++)
	{
		CurrentUserWater = m_SharedData.userFlux[i] + CurrentUserWater;
	}
	CProgressCtrl* pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO3);
	pBar->SetPos(m_SharedData.userFlux[2]*25);
	CString str;
	str.Format("%d",m_SharedData.userFlux[2]);
	SetDlgItemText(IDC_EDIT3,str);	
	*pResult = 0;
}

void CMFCView::OnDeltaposSpin4(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	if( m_SharedData.cistern == 0)
		return;
	if( pNMUpDown->iDelta == -1 )
	{
		if( m_SharedData.userFlux[3] == 4 )
		{
			m_SharedData.userFlux[3] = 4;
		}
		else
		{
			m_SharedData.userFlux[3]++;
		}
	}
	if( pNMUpDown->iDelta == 1 )
	{
		if( m_SharedData.userFlux[3] == 0 )
		{
			m_SharedData.userFlux[3] = 0;
		}
		else
		{
			m_SharedData.userFlux[3]--;
		}
	}
	if(CurrentUserWater !=0)
	{
		CurrentUserWater = 0;
	}
	for(int i = 0;i < 5; i++)
	{
		CurrentUserWater = m_SharedData.userFlux[i] + CurrentUserWater;
	}
	CProgressCtrl* pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO4);
	pBar->SetPos(m_SharedData.userFlux[3]*25);
	CString str;
	str.Format("%d",m_SharedData.userFlux[3]);
	SetDlgItemText(IDC_EDIT4,str);	
	*pResult = 0;
}

void CMFCView::OnDeltaposSpin5(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	if( m_SharedData.cistern == 0)
		return;
	if( pNMUpDown->iDelta == -1 )
	{
		if( m_SharedData.userFlux[4] == 4 )
		{
			m_SharedData.userFlux[4] = 4;
		}
		else
		{
			m_SharedData.userFlux[4]++;
		}
	}
	if( pNMUpDown->iDelta == 1 )
	{
		if( m_SharedData.userFlux[4] == 0 )
		{
			m_SharedData.userFlux[4] = 0;
		}
		else
		{
			m_SharedData.userFlux[4]--;
		}
	}
	if(CurrentUserWater !=0)
	{
		CurrentUserWater = 0;
	}
	for(int i = 0;i < 5; i++)
	{
		CurrentUserWater = m_SharedData.userFlux[i] + CurrentUserWater;
	}
	CProgressCtrl* pBar = (CProgressCtrl*) GetDlgItem(IDC_PRO5);
	pBar->SetPos(m_SharedData.userFlux[4]*25);
	CString str;
	str.Format("%d",m_SharedData.userFlux[4]);
	SetDlgItemText(IDC_EDIT5,str);	
	*pResult = 0;
}

void CMFCView::OnButton1() 
{
	// TODO: Add your control notification handler code here
	if(!Break)
	{
		GetDlgItem(ID_START)->EnableWindow(FALSE);
		Break = true;
		m_SharedData.affuseFlux = 0;
		SetDlgItemText(IDC_BUTTON1,"恢复补水系统");
	}
	else
	{
		GetDlgItem(ID_START)->EnableWindow(TRUE);
		Break = false;
		SetDlgItemText(IDC_BUTTON1,"补水系统故障");
	}
}

⌨️ 快捷键说明

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