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 + -
显示快捷键?