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