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

📄 threadsynchronizationview.cpp

📁 VisualC高级编程技术精粹.rar
💻 CPP
字号:
// ThreadSynchronizationView.cpp : implementation of the CThreadSynchronizationView class
//

#include "stdafx.h"
#include "ThreadSynchronization.h"

#include "ThreadSynchronizationDoc.h"
#include "ThreadSynchronizationView.h"

#include "afxmt.h"

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

int g_nCount;
int g_arrData[6];

/////////////////////////////////////////////////////////////////////////////
// CThreadSynchronizationView

IMPLEMENT_DYNCREATE(CThreadSynchronizationView, CView)

BEGIN_MESSAGE_MAP(CThreadSynchronizationView, CView)
	//{{AFX_MSG_MAP(CThreadSynchronizationView)
	ON_COMMAND(IDC_THREAD_SYNC_CRITICALSECTION, OnThreadSyncCriticalsection)
	ON_COMMAND(IDC_THREAD_SYNC_MUTEX, OnThreadSyncMutex)
	ON_COMMAND(IDC_THREAD_SYNC_SEMAPHORE, OnThreadSyncSemaphore)
	ON_COMMAND(IDC_THREAD_SYNC_EVENT, OnThreadSyncEvent)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CThreadSynchronizationView construction/destruction

CThreadSynchronizationView::CThreadSynchronizationView()
{
	// TODO: add construction code here
	m_bCriticalSection = FALSE;
	m_bMutex = FALSE;
	m_bSemaphore = FALSE;
	m_bEvent = FALSE;
}

CThreadSynchronizationView::~CThreadSynchronizationView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CThreadSynchronizationView drawing

void CThreadSynchronizationView::OnDraw(CDC* pDC)
{
	CThreadSynchronizationDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	CRect Rect;
	GetClientRect(&Rect);

	if (m_bCriticalSection)
	{
		pDC->SetTextColor(RGB(255,0,0));
		pDC->TextOut(300, 0, _T("线程同步--->使用临界区")) ;
	}

	if (m_bMutex)
	{
		pDC->SetTextColor(RGB(0,0,255));
		pDC->TextOut(300, 0, _T("线程同步--->使用互斥量")) ;
	}

	if (m_bSemaphore)
	{
		pDC->SetTextColor(RGB(255,0,255));		
		pDC->TextOut(300, 0, _T("线程同步--->使用信号量")) ;
	}

	if (m_bEvent)
	{
		pDC->SetTextColor(RGB(0,255,0));		
		pDC->TextOut(300, 0, _T("线程同步--->使用事件")) ;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CThreadSynchronizationView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CThreadSynchronizationView diagnostics

#ifdef _DEBUG
void CThreadSynchronizationView::AssertValid() const
{
	CView::AssertValid();
}

void CThreadSynchronizationView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CThreadSynchronizationView message handlers
CCriticalSection myCriticalsection;

UINT MyCriticalSectionFunc(LPVOID param)
{
	myCriticalsection.Lock();

	for (int i = 0; i < 6; i++)
	{
		g_nCount++;
		::Sleep(100);
		g_arrData[i] = g_nCount;
	}

	myCriticalsection.Unlock();

	// 输出信息
	CString csOutput = _T("");
	csOutput.Format(_T("%d,%d,%d,%d,%d,%d"),
		            g_arrData[0],
					g_arrData[1],
					g_arrData[2],
					g_arrData[3],
					g_arrData[4],
					g_arrData[5]);
	AfxMessageBox(csOutput);

	return 0;
}

void CThreadSynchronizationView::OnThreadSyncCriticalsection() 
{
	// TODO: Add your command handler code here
	m_bCriticalSection = TRUE;
	m_bMutex = FALSE;
	m_bSemaphore = FALSE;
	m_bEvent = FALSE;
	CPaintDC dc(this); // device context for painting
	
	OnDraw(&dc);
	Invalidate();

	// 启动线程
	g_nCount = 0;
	HWND hWnd = GetSafeHwnd();
	AfxBeginThread(MyCriticalSectionFunc,hWnd);
}

CMutex myMutex;

UINT MyMutexFunc(LPVOID param)
{
	CSingleLock singleLock(&myMutex);
	singleLock.Lock();

	for (int i = 0; i < 6; i++)
	{
		g_nCount++;
		::Sleep(100);
		g_arrData[i] = g_nCount;
	}

	singleLock.Unlock();

	// 输出信息
	CString csOutput = _T("");
	csOutput.Format(_T("%d,%d,%d,%d,%d,%d"),
		            g_arrData[0],
					g_arrData[1],
					g_arrData[2],
					g_arrData[3],
					g_arrData[4],
					g_arrData[5]);
	AfxMessageBox(csOutput);
	return 0;
}

void CThreadSynchronizationView::OnThreadSyncMutex() 
{
	// TODO: Add your command handler code here
	m_bMutex = TRUE; 
	m_bCriticalSection = FALSE;
	m_bSemaphore = FALSE;
	m_bEvent = FALSE;
	CPaintDC dc(this); // device context for painting
	
	OnDraw(&dc);
	Invalidate();

	// 启动线程
	g_nCount = 0;
	HWND hWnd = GetSafeHwnd();
	AfxBeginThread(MyMutexFunc,hWnd);
}

CSemaphore mySemaphore(1,1);

UINT MySemaphoreFunc(LPVOID param)
{
	CSingleLock singleLock(&mySemaphore);
	singleLock.Lock();

	for (int i = 0; i < 6; i++)
	{
		g_nCount++;
		::Sleep(100);
		g_arrData[i] = g_nCount;
	}

	singleLock.Unlock();

	// 输出信息
	CString csOutput = _T("");
	csOutput.Format(_T("%d,%d,%d,%d,%d,%d"),
		            g_arrData[0],
					g_arrData[1],
					g_arrData[2],
					g_arrData[3],
					g_arrData[4],
					g_arrData[5]);
	AfxMessageBox(csOutput);

	return 0;	
}

void CThreadSynchronizationView::OnThreadSyncSemaphore() 
{
	// TODO: Add your command handler code here
	m_bSemaphore = TRUE;
	m_bCriticalSection = FALSE;
	m_bMutex = FALSE;
	m_bEvent = FALSE;
	CPaintDC dc(this); // device context for painting
	
	OnDraw(&dc);
	Invalidate();

	// 启动线程
	g_nCount = 0;
	HWND hWnd = GetSafeHwnd();
	AfxBeginThread(MySemaphoreFunc,hWnd);
}


// 事件数组
HANDLE g_Events[2];

UINT MyEventFunc(LPVOID param)
{
	for (int i = 0; i < 6; i++)
	{
		g_nCount++;
		::Sleep(100);
		g_arrData[i] = g_nCount;
	}

	// 输出信息
	CString csOutput = _T("");
	csOutput.Format(_T("%d,%d,%d,%d,%d,%d"),
		            g_arrData[0],
					g_arrData[1],
					g_arrData[2],
					g_arrData[3],
					g_arrData[4],
					g_arrData[5]);
	AfxMessageBox(csOutput);

	// 回置事件 
	SetEvent(g_Events[0]);
	return 0;
}

void CThreadSynchronizationView::OnThreadSyncEvent() 
{
	// TODO: Add your command handler code here
	m_bEvent = TRUE;
	m_bCriticalSection = FALSE;
	m_bMutex = FALSE;
	m_bSemaphore = FALSE;
	CPaintDC dc(this); // device context for painting
	
	OnDraw(&dc);
	Invalidate();

	// 创建事件
	g_Events[0] = CreateEvent(NULL,false,false,NULL); 

	// 启动线程
	g_nCount = 0;
	HWND hWnd = GetSafeHwnd();
	AfxBeginThread(MyEventFunc,hWnd);
}





⌨️ 快捷键说明

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