multitrddlg.cpp

来自「一些VC++的经典实例」· C++ 代码 · 共 128 行

CPP
128
字号
// MultiTrdDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ex23.h"
#include "MultiTrdDlg.h"
#include "Afxmt.h"


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

/////////////////////////////////////////////////////////////////////////////
// CMultiTrdDlg dialog
#define WM_THREADEND  WM_USER+10//WM_USER是对话框定义第一个消息,由于添加了
								//另外几个消息相应函数,因此加上10作为自定义
								//的消息标号
CEvent m_Event;

UINT ThreadProc(LPVOID pTrd)
{
	while(1)
	{
		if(::WaitForSingleObject(m_Event,0)==WAIT_OBJECT_0)
		{
			break;
		}
	}
	//线程结束前,通过自定义消息向用户提示线程结束
	::PostMessage((HWND)pTrd,WM_THREADEND,0,0);
	return 0;
}

CMultiTrdDlg::CMultiTrdDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMultiTrdDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMultiTrdDlg)
	//}}AFX_DATA_INIT
}


void CMultiTrdDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMultiTrdDlg)
	DDX_Control(pDX, ID_STOP, m_Stop);
	DDX_Control(pDX, ID_START, m_Start);
	DDX_Control(pDX, IDC_PROGRESS1, m_ProCtrl);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMultiTrdDlg, CDialog)
	//{{AFX_MSG_MAP(CMultiTrdDlg)
	ON_BN_CLICKED(ID_START, OnStart)
	ON_BN_CLICKED(ID_STOP, OnStop)
	ON_WM_TIMER()
	ON_MESSAGE(WM_THREADEND,OnThreadEnd)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMultiTrdDlg message handlers

void CMultiTrdDlg::OnStart() 
{
	// TODO: Add your control notification handler code here
	//调用函数开始进程
	AfxBeginThread(ThreadProc,GetSafeHwnd());
	//启动计时器,使进度条按照指定时间更新
	m_nTimer=SetTimer(1,100,NULL);
	//禁止"开始"按钮,同时使"停止"按钮有效
	m_Start.EnableWindow(FALSE);
	m_Stop.EnableWindow(TRUE);
}

void CMultiTrdDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	//需要停止线程时,将终止事件置于有信号状态
	m_Event.SetEvent();
	//停止计时器
	KillTimer(m_nTimer);
	//恢复各个控件的状态
	m_Start.EnableWindow(TRUE);
	m_Stop.EnableWindow(FALSE);
	m_ProCtrl.SetPos(0);
}

void CMultiTrdDlg::OnOK() 
{
	// TODO: Add extra validation here
	KillTimer(m_nTimer);//终止线程,并退出对话框
	m_Event.SetEvent();
	CDialog::OnOK();
}

void CMultiTrdDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	m_ProCtrl.StepIt();//默认步进,每次前进一格,若到达上限则折回下限继续循环
	CDialog::OnTimer(nIDEvent);
}

void CMultiTrdDlg::OnThreadEnd()
{
	AfxMessageBox("线程结束!");
}

BOOL CMultiTrdDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_ProCtrl.SetRange(0,1000);
	m_ProCtrl.SetPos(0);
	//由于进程尚未开始,使停止进程的按钮不能使用
	m_Stop.EnableWindow(FALSE);
	//使终止进程对象出于无信号状态
	m_Event.ResetEvent();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

⌨️ 快捷键说明

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