📄 criticalview.cpp
字号:
// CriticalView.cpp : implementation of the CCriticalView class
//
#include "stdafx.h"
#include "Critical.h"
#include "CriticalDoc.h"
#include "CriticalView.h"
#include "afxmt.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CCriticalSection criticalSection ; // 声明一个临界段对象
/////////////////////////////////////////////////////////////////////////////
// CCriticalView
IMPLEMENT_DYNCREATE(CCriticalView, CView)
BEGIN_MESSAGE_MAP(CCriticalView, CView)
//{{AFX_MSG_MAP(CCriticalView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCriticalView construction/destruction
CCriticalView::CCriticalView()
{
// TODO: add construction code here
}
CCriticalView::~CCriticalView()
{
}
BOOL CCriticalView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CCriticalView drawing
void CCriticalView::OnDraw(CDC* pDC)
{
CCriticalDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CCriticalView printing
BOOL CCriticalView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CCriticalView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CCriticalView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CCriticalView diagnostics
#ifdef _DEBUG
void CCriticalView::AssertValid() const
{
CView::AssertValid();
}
void CCriticalView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CCriticalDoc* CCriticalView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCriticalDoc)));
return (CCriticalDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCriticalView message handlers
///////////////////////////////////////////////////////////////
// 测试临界段的第一个线程函数
UINT CriticalThread1(LPVOID pParam)
{
criticalSection.Lock(); // 试图锁定临界段
HWND hWnd = (HWND) pParam;
// 弹出消息框表明线程已经锁定了临界段,并开始执行
::MessageBox(hWnd, "第1个线程启动。",
"线程执行情况", MB_ICONEXCLAMATION | MB_OK);
criticalSection.Unlock(); // 解锁临界段
// 弹出消息框表明线程解除了对临界段的锁定
::MessageBox(hWnd, "第1个线程释放临界段。",
"线程执行情况", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
///////////////////////////////////////////////////////////////
// 测试临界段的第二个线程函数
UINT CriticalThread2(LPVOID pParam)
{
criticalSection.Lock(); // 试图锁定临界段
HWND hWnd = (HWND) pParam;
// 弹出消息框表明线程已经锁定了临界段,并开始执行
::MessageBox(hWnd, "第2个线程启动。",
"线程执行情况", MB_ICONEXCLAMATION | MB_OK);
criticalSection.Unlock(); // 解锁临界段
// 弹出消息框表明线程解除了对临界段的锁定
::MessageBox(hWnd, "第2个线程释放临界段。",
"线程执行情况", MB_ICONEXCLAMATION | MB_OK);
return 0;
}
void CCriticalView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
HWND hWnd = GetSafeHwnd(); // 获取视图窗口的句柄
AfxBeginThread(CriticalThread1, hWnd); // 启动第一个线程
AfxBeginThread(CriticalThread2, hWnd); // 启动第二个线程
CView::OnLButtonDown(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -