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

📄 synchronizedlg.cpp

📁 《Visual C++.NET MFC类库应用详解》程序实例
💻 CPP
字号:
// SynchronizeDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Synchronize.h"
#include "SynchronizeDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CCounterThread

IMPLEMENT_DYNCREATE(CCounterThread, CWinThread)

CCounterThread::CCounterThread()
{
	m_pOwner = NULL;
}

CCounterThread::~CCounterThread()
{
}

BOOL CCounterThread::InitInstance()
{
	return TRUE;
}

int CCounterThread::Run()
{
	BOOL fSyncChecked;
	int nNumber=0;
	if (m_pOwner == NULL) return -1;
	CSingleLock sLock(&(m_pOwner->m_SyncObj));
	while (TRUE)
	{
		fSyncChecked = m_pOwner->IsDlgButtonChecked(IDC_SYNCHRONIZE);
//		if (fSyncChecked)//本句用于CCriticalSection,CMutex和CSemaphore
		if (fSyncChecked && (::WaitForSingleObject(m_pOwner->m_SyncObj,0)==WAIT_OBJECT_0))//本句用于CEvent
			sLock.Lock();
		_stscanf((LPCTSTR) m_pOwner->m_strNumber, _T("%d"), &nNumber);
		nNumber++;
		while (nNumber != 0)
		{
			m_pOwner->m_strNumber.Format("%d",nNumber%10000);
			Sleep(200);
			nNumber /= 10000;
		}
		if (fSyncChecked) 
		{
			m_pOwner->m_SyncObj.SetEvent();
			sLock.Unlock();
		}
		if (m_pOwner->IsDlgButtonChecked(IDC_SHOWCNTRTHRD))
			m_pOwner->AddToListBox(_T("Counter: Increment"));
	}
	m_pOwner->PostMessage(WM_CLOSE, 0, 0L);
	return 0;
}

BEGIN_MESSAGE_MAP(CCounterThread, CWinThread)

END_MESSAGE_MAP()

// CDisplayThread

IMPLEMENT_DYNCREATE(CDisplayThread, CWinThread)

CDisplayThread::CDisplayThread()
{
	m_pOwner = NULL;
}

CDisplayThread::~CDisplayThread()
{
}

BOOL CDisplayThread::InitInstance()
{
	return TRUE;
}

int CDisplayThread::Run()
{
	BOOL fSyncChecked;
	CString strBuffer;
	if (m_pOwner == NULL) return -1;
	CSingleLock sLock(&(m_pOwner->m_SyncObj));
	while (TRUE)
	{
		fSyncChecked = m_pOwner->IsDlgButtonChecked(IDC_SYNCHRONIZE);
//		if (fSyncChecked) //本句用于CCriticalSection,CMutex和CSemaphore
		if (fSyncChecked && (::WaitForSingleObject(m_pOwner->m_SyncObj,0)==WAIT_OBJECT_0)) //本句用于CEvent
			sLock.Lock();
		Sleep(1000);
		strBuffer = _T("Display: ");
		strBuffer += m_pOwner->m_strNumber;
		if (fSyncChecked) 
		{
			m_pOwner->m_SyncObj.SetEvent();
			sLock.Unlock();
		}
		m_pOwner->AddToListBox(strBuffer);
	}
	m_pOwner->PostMessage(WM_CLOSE, 0, 0L);
	return 0;
}

BEGIN_MESSAGE_MAP(CDisplayThread, CWinThread)

END_MESSAGE_MAP()


// CSynchronizeDlg 对话框

CSynchronizeDlg::CSynchronizeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSynchronizeDlg::IDD, pParent),
	 m_strNumber(_T("0"))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_pCounterThread = NULL;
	m_pDisplayThread = NULL;
}

void CSynchronizeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSynchronizeDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_PAUSE, OnBnClickedPause)
	ON_CBN_SELCHANGE(IDC_DSPYTHRDPRIORITY, OnCbnSelchangeDspythrdpriority)
	ON_CBN_SELCHANGE(IDC_CNTRTHRDPRIORITY, OnCbnSelchangeCntrthrdpriority)
END_MESSAGE_MAP()


// CSynchronizeDlg 消息处理程序

BOOL CSynchronizeDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:在此添加额外的初始化代码

	// 填充显示线程优先级组合框
	CComboBox* pBox;
	pBox = (CComboBox*) GetDlgItem(IDC_DSPYTHRDPRIORITY);
	ASSERT(pBox != NULL);
	if (pBox != NULL)
	{
		pBox->AddString(_T("Idle"));
		pBox->AddString(_T("Lowest"));
		pBox->AddString(_T("Below normal"));
		pBox->AddString(_T("Normal"));
		pBox->AddString(_T("Above normal"));
		pBox->SetCurSel(3);  // Normal
	}

	// 填充计算线程优先级组合框
	pBox = (CComboBox*) GetDlgItem(IDC_CNTRTHRDPRIORITY);
	ASSERT(pBox != NULL);
	if (pBox != NULL)
	{
		pBox->AddString(_T("Idle"));
		pBox->AddString(_T("Lowest"));
		pBox->AddString(_T("Below normal"));
		pBox->AddString(_T("Normal"));
		pBox->AddString(_T("Above normal"));
		pBox->SetCurSel(3);  // Normal
	}

	// 初始化线程并开始运行!
	m_pDisplayThread = (CDisplayThread*)
		AfxBeginThread(RUNTIME_CLASS(CDisplayThread), THREAD_PRIORITY_NORMAL,
			0, CREATE_SUSPENDED);
	m_pDisplayThread->m_pOwner=this;
	m_pDisplayThread->ResumeThread();

	m_pCounterThread = (CCounterThread*)
		AfxBeginThread(RUNTIME_CLASS(CCounterThread), THREAD_PRIORITY_NORMAL,
			0, CREATE_SUSPENDED);
	m_pCounterThread->m_pOwner=this;
	m_pCounterThread->ResumeThread();

	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CSynchronizeDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CSynchronizeDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CSynchronizeDlg::AddToListBox(LPCTSTR szBuffer)
{
	CListBox* pBox = (CListBox*) GetDlgItem(IDC_DATABOX);
	ASSERT(pBox != NULL);

	if (pBox != NULL)
	{
		int x = pBox->AddString(szBuffer);
		pBox->SetCurSel(x);

		if (pBox->GetCount() > 100)
			pBox->DeleteString(0);
	}
}

void CSynchronizeDlg::OnPriorityChange(UINT nID)
{
	ASSERT(nID == IDC_CNTRTHRDPRIORITY || nID == IDC_DSPYTHRDPRIORITY);

	DWORD dw;
	CComboBox* pBox = (CComboBox*) GetDlgItem(nID);
	int nCurSel = pBox->GetCurSel();

	switch (nCurSel)
	{
	case 0:
		dw = (DWORD) THREAD_PRIORITY_IDLE;
		break;

	case 1:
		dw = (DWORD) THREAD_PRIORITY_LOWEST;
		break;

	case 2:
		dw = (DWORD) THREAD_PRIORITY_BELOW_NORMAL;
		break;

	case 3:
	default:
		dw = (DWORD) THREAD_PRIORITY_NORMAL;
		break;

	case 4:
		dw = (DWORD) THREAD_PRIORITY_ABOVE_NORMAL;
		break;
	}

	if (nID == IDC_CNTRTHRDPRIORITY)
		m_pCounterThread->SetThreadPriority(dw);
	else
		m_pDisplayThread->SetThreadPriority(dw);
}

void CSynchronizeDlg::OnBnClickedPause()
{
	// TODO: 在此添加控件通知处理程序代码
	CButton* pCheck = (CButton*) GetDlgItem(IDC_PAUSE);
	BOOL bPaused = ((pCheck->GetState() & 0x003) != 0);

	if (bPaused)
	{
		m_pCounterThread->SuspendThread();
		m_pDisplayThread->SuspendThread();
	}
	else
	{
		m_pCounterThread->ResumeThread();
		m_pDisplayThread->ResumeThread();
	}
}

void CSynchronizeDlg::OnCbnSelchangeDspythrdpriority()
{
	// TODO: 在此添加控件通知处理程序代码
	OnPriorityChange(IDC_DSPYTHRDPRIORITY);
}

void CSynchronizeDlg::OnCbnSelchangeCntrthrdpriority()
{
	// TODO: 在此添加控件通知处理程序代码
	OnPriorityChange(IDC_CNTRTHRDPRIORITY);
}

⌨️ 快捷键说明

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