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