实例——CountTestThreadMFC
1.CountTestThreadMFCDlg.cpp关键代码
#include "CountThread.h" #include "DisplayThread.h" BEGIN_MESSAGE_MAP(CCountTestThreadMFCDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_CBN_SELCHANGE(IDC_COMBO1, &CCountTestThreadMFCDlg::OnCbnSelchangeCombo1) ON_CBN_SELCHANGE(IDC_COMBO2, &CCountTestThreadMFCDlg::OnCbnSelchangeCombo2) ON_CBN_SELCHANGE(IDC_COMBO3, &CCountTestThreadMFCDlg::OnCbnSelchangeCombo3) ON_BN_CLICKED(IDC_CHECK3, &CCountTestThreadMFCDlg::OnBnClickedCheck3) END_MESSAGE_MAP() BOOL CCountTestThreadMFCDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 //定义的成员变量 // CString mStrNamber;//线程所要操作的资源对象 // CMutex* mMutex;//用于同步机制的互斥量 // CWinThread* m_pCounterThread;//指向计数线程的指针 // CWinThread* m_pDisplayThread;//指向显示线程的指针 CComboBox* pBox; pBox=(CComboBox*)GetDlgItem(IDC_COMBO1); ASSERT(pBox != NULL); if (pBox != NULL) { pBox->AddString(L"Idle"); pBox->AddString(L"Normal"); pBox->AddString(L"High"); pBox->AddString(L"Realtime"); pBox->SetCurSel(1); } pBox=(CComboBox*)GetDlgItem(IDC_COMBO2); ASSERT(pBox != NULL); if (pBox != NULL) { pBox->AddString(L"Idle"); pBox->AddString(L"Lowest"); pBox->AddString(L"BelowNormal"); pBox->AddString(L"Normal"); pBox->AddString(L"AboveNormal"); pBox->AddString(L"Highest"); pBox->AddString(L"Timecritical"); pBox->SetCurSel(3); } pBox=(CComboBox*)GetDlgItem(IDC_COMBO3); ASSERT(pBox != NULL); if (pBox != NULL) { pBox->AddString(L"Idle"); pBox->AddString(L"Lowest"); pBox->AddString(L"BelowNormal"); pBox->AddString(L"Normal"); pBox->AddString(L"AboveNormal"); pBox->AddString(L"Highest"); pBox->AddString(L"Timecritical"); pBox->SetCurSel(3); } //初始化挂起复选框为挂起状态 CButton* pBtn=(CButton*)GetDlgItem(IDC_CHECK3); pBtn->SetCheck(1); mStrNamber="0"; mMutex=new CMutex(FALSE,NULL,NULL); //初始化线程 CCountThread* pCountThread=new CCountThread; pCountThread->SetOwner(this); m_pCounterThread=pCountThread->myCreateThread(); CDisplayThread* pDisplayThread=new CDisplayThread; pDisplayThread->SetOwner(this); m_pDisplayThread=pDisplayThread->myCreateThread(); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CCountTestThreadMFCDlg::OnPriorityChange(UINT nID) { ASSERT(nID == IDC_COMBO2 || nID == IDC_COMBO3); CComboBox* pBox=(CComboBox*)GetDlgItem(nID); int nCurSel=pBox->GetCurSel(); DWORD dw; switch (nCurSel)//工作线程的优先级有以下7种 { case 0:dw=THREAD_PRIORITY_IDLE;break; case 1:dw=THREAD_PRIORITY_LOWEST;break; case 2:dw=THREAD_PRIORITY_BELOW_NORMAL;break; case 3: default: dw=THREAD_PRIORITY_NORMAL;break; case 4:dw=THREAD_PRIORITY_ABOVE_NORMAL;break; case 5:dw=THREAD_PRIORITY_HIGHEST;break; case 6:dw=THREAD_PRIORITY_TIME_CRITICAL;break; } if (nID == IDC_COMBO2) { m_pCounterThread->SetThreadPriority(dw);//调整计数线程优先级 } else { m_pDisplayThread->SetThreadPriority(dw);//调整显示线程优先级 } } //进程优先级下拉框选项已更改事件 void CCountTestThreadMFCDlg::OnCbnSelchangeCombo1() { CComboBox* pBox=(CComboBox*)GetDlgItem(IDC_COMBO1); int nCurSel=pBox->GetCurSel(); DWORD dw; switch (nCurSel)//界面线程的优先级有以下4种 { case 0: dw=IDLE_PRIORITY_CLASS;break; case 1: default: dw=NORMAL_PRIORITY_CLASS;break; case 2: dw=HIGH_PRIORITY_CLASS;break; case 3: dw=REALTIME_PRIORITY_CLASS;break; } SetPriorityClass(GetCurrentProcess(),dw);//设置进程的优先级 } //计数线程下拉框选项已更改事件 void CCountTestThreadMFCDlg::OnCbnSelchangeCombo2() { OnPriorityChange(IDC_COMBO2); } //显示线程下拉框选项已更改事件 void CCountTestThreadMFCDlg::OnCbnSelchangeCombo3() { OnPriorityChange(IDC_COMBO3); } //挂起复选框单击事件 void CCountTestThreadMFCDlg::OnBnClickedCheck3() { CButton* pBtn=(CButton*)GetDlgItem(IDC_CHECK3); int state=pBtn->GetCheck(); if (state == 1)//要改为挂起 { m_pCounterThread->SuspendThread(); m_pDisplayThread->SuspendThread(); } else { m_pCounterThread->ResumeThread(); m_pDisplayThread->ResumeThread(); } } //向列表框中添加显示信息 void CCountTestThreadMFCDlg::AddToListBox(LPCTSTR szBuffer) { CListBox* pListBox=(CListBox*)GetDlgItem(IDC_LIST_DATA); ASSERT(pListBox != NULL); if (pListBox != NULL) { int x=pListBox->AddString(szBuffer); pListBox->SetCurSel(x); if (pListBox->GetCount()>15) { pListBox->DeleteString(0); } } }
2.BasicClass父类
//BasicClass.h 文件 #pragma once #include "CountTestThreadMFCDlg.h" class CCountTestThreadMFCDlg; class BasicClass { public: BasicClass(void); virtual ~BasicClass(void); CCountTestThreadMFCDlg* mpCountTestThreadDlg; void SetOwner(CCountTestThreadMFCDlg* Owner); };
//BasicClass.cpp 文件 #include "StdAfx.h" #include "BasicClass.h" BasicClass::BasicClass(void) { mpCountTestThreadDlg=NULL; } BasicClass::~BasicClass(void) { } void BasicClass::SetOwner(CCountTestThreadMFCDlg* Owner) { mpCountTestThreadDlg=Owner; }
3.CountThread子类
//CCountThread.h 文件 #pragma once #include "BasicClass.h" class CCountThread : public BasicClass { public: CCountThread(void); virtual ~CCountThread(void); CWinThread* myCreateThread();//创建线程计数 friend UINT AddOne(LPVOID pParam);//加1计数 };
//CCountThread.h 文件 #include "StdAfx.h" #include "CountThread.h" CCountThread::CCountThread(void) { } CCountThread::~CCountThread(void) { } CWinThread* CCountThread::myCreateThread() { return AfxBeginThread(AddOne,(LPVOID)mpCountTestThreadDlg,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); } UINT AddOne(LPVOID pParam) { CCountTestThreadMFCDlg* mpCountTestThreadMFCDlg=(CCountTestThreadMFCDlg*)pParam; if (mpCountTestThreadMFCDlg == NULL) { return -1; } BOOL fSyncChecked;//线程同步机制复选检测 unsigned int nNumber;//存储字符串中整数 CSingleLock singleLock(mpCountTestThreadMFCDlg->mMutex); while(true) { fSyncChecked=mpCountTestThreadMFCDlg->IsDlgButtonChecked(IDC_CHECK1); if (fSyncChecked) { singleLock.Lock(); } nNumber=_ttoi(mpCountTestThreadMFCDlg->mStrNamber); nNumber++; mpCountTestThreadMFCDlg->mStrNamber.Empty(); mpCountTestThreadMFCDlg->mStrNamber.Format(_T("%d"),nNumber); if (mpCountTestThreadMFCDlg->IsDlgButtonChecked(IDC_CHECK2)) { mpCountTestThreadMFCDlg->AddToListBox(_T("Counter:Add 1")); } Sleep(500); if (fSyncChecked) { singleLock.Unlock(); } } mpCountTestThreadMFCDlg->PostMessageW(WM_CLOSE,0,0); return 0; }
4.DisplayThread子类
//DisplayThread.h文件 #pragma once #include "BasicClass.h" class CDisplayThread : public BasicClass { public: CDisplayThread(void); virtual ~CDisplayThread(void); CWinThread* myCreateThread(); friend UINT Display(LPVOID pParam); };
//DisplayThread.cpp文件 #include "StdAfx.h" #include "DisplayThread.h" CDisplayThread::CDisplayThread(void) { } CDisplayThread::~CDisplayThread(void) { } CWinThread* CDisplayThread::myCreateThread() { return AfxBeginThread(Display,mpCountTestThreadDlg,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); } UINT Display(LPVOID pParam) { CCountTestThreadMFCDlg* mpCounterThreadDlg=(CCountTestThreadMFCDlg*)pParam; ASSERT(mpCounterThreadDlg!=NULL); if (mpCounterThreadDlg == NULL) { return -1; } BOOL fSyncChecked; CString strBuffer; CSingleLock singleLock(mpCounterThreadDlg->mMutex); while (true) { fSyncChecked=mpCounterThreadDlg->IsDlgButtonChecked(IDC_CHECK1); if (fSyncChecked) { singleLock.Lock(); } strBuffer=_T("Display:"); strBuffer+= mpCounterThreadDlg->mStrNamber; mpCounterThreadDlg->AddToListBox(strBuffer); Sleep(1000); if (fSyncChecked) { singleLock.Unlock(); } } mpCounterThreadDlg->PostMessageW(WM_CLOSE,0,0); return 0; }
5.运行结果