由于主程序启动的时候要从服务器端获取一些数据,在等待数据的过程中,时常由于网络速度问题,让客户等待的时间长短不一。为了解决客户反映的卡死情况,我特定在程序启动的时候添加了进度条显示。下面就是我的例子。
具体实现的代码:
#pragma once
/
// CShowProgressDlg dialog
class CShowProgressDlg : public CDialog
{
// Construction
public:
CShowProgressDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CShowProgressDlg();
// Dialog Data
//{{AFX_DATA(CShowProgressDlg)
enum { IDD = IDD_SHOWPROGRESS_DIALOG };
CProgressCtrl m_Prgrs_Data;
CString m_strText;
//}}AFX_DATA
void SetText(const char* _Text);
void StartTimer();
void EndTimer();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CShowProgressDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CShowProgressDlg)
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
virtual void OnOK();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif
// ShowProgressDlg.cpp : implementation file
//
#include "stdafx.h"
#include "XXX.h"
#include "ShowProgressDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CShowProgressDlg dialog
CShowProgressDlg::CShowProgressDlg(CWnd* pParent /*=NULL*/)
: CDialog(CShowProgressDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CShowProgressDlg)
m_strText = _T("");
//}}AFX_DATA_INIT
}
CShowProgressDlg::~CShowProgressDlg()
{
DestroyWindow();
}
void CShowProgressDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CShowProgressDlg)
DDX_Control(pDX, IDC_DATAPROGRESS, m_Prgrs_Data);
DDX_Text(pDX, IDC_STATIC_TEXT, m_strText);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CShowProgressDlg, CDialog)
//{{AFX_MSG_MAP(CShowProgressDlg)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CShowProgressDlg message handlers
BOOL CShowProgressDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_Prgrs_Data.SetRange(0,100);
m_Prgrs_Data.SetStep(5);
m_Prgrs_Data.SetPos(0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CShowProgressDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
UpdateData();
if(nIDEvent == 1)
{
if(m_Prgrs_Data.StepIt() > 100)
m_Prgrs_Data.SetPos(0);
}
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
void CShowProgressDlg::OnOK()
{
// TODO: Add extra validation here
// CDialog::OnOK();
}
void CShowProgressDlg::StartTimer()
{
m_Prgrs_Data.SetPos(0);
SetTimer(1,1000,NULL);
}
void CShowProgressDlg::EndTimer()
{
KillTimer(1);
}
void CShowProgressDlg::SetText(const char* _Text)
{
m_strText = _Text;
UpdateData(FALSE);
}
#pragma once
#include "ShowProgressDlg.h"
/
// CShowProgressThread thread
class CShowProgressThread : public CWinThread
{
DECLARE_DYNCREATE(CShowProgressThread)
protected:
CShowProgressThread(); // protected constructor used by dynamic creation
// Attributes
public:
// Operations
public:
void HideDialog();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CShowProgressThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
// Implementation
protected:
virtual ~CShowProgressThread();
CShowProgressDlg* m_pShowProgrsDlg;
// Generated message map functions
//{{AFX_MSG(CShowProgressThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif
#include "stdafx.h"
#include "XXX.h"
#include "ShowProgressThread.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CShowProgressThread
IMPLEMENT_DYNCREATE(CShowProgressThread, CWinThread)
CShowProgressThread::CShowProgressThread()
{
m_bAutoDelete = TRUE;
}
CShowProgressThread::~CShowProgressThread()
{
}
BOOL CShowProgressThread::InitInstance()
{
// TODO: perform and per-thread initialization here
::AttachThreadInput(m_nThreadID, AfxGetApp()->m_nThreadID, TRUE);
m_pShowProgrsDlg = new CShowProgressDlg;
m_pShowProgrsDlg->Create(IDD_SHOWPROGRESS_DIALOG);
m_pShowProgrsDlg->ShowWindow(SW_SHOW);
m_pShowProgrsDlg->SetText("正在获取数据,请稍等片刻...");
m_pShowProgrsDlg->StartTimer();
return TRUE;
}
int CShowProgressThread::ExitInstance()
{
// TODO: perform any per-thread cleanup here
delete m_pShowProgrsDlg;
m_pShowProgrsDlg = NULL;
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CShowProgressThread, CWinThread)
//{{AFX_MSG_MAP(CShowProgressThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CShowProgressThread message handlers
void CShowProgressThread::HideDialog()
{
m_pShowProgrsDlg->SendMessage(WM_CLOSE);
}
在APP.h文件里添加下面这几句:
#include "ShowProgressThread.h"
class CXXXApp : public CWinApp
{
public:
CShowProgressThread* m_pShowThread;
}
然后再在App.cpp文件里添加下面这几句:
BOOL CXXXApp::InitInstance()
{
m_pShowThread = (CShowProgressThread*) AfxBeginThread(
RUNTIME_CLASS(CShowProgressThread),
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
ASSERT(m_pShowThread->IsKindOf(RUNTIME_CLASS(CShowProgressThread)));
m_pShowThread->ResumeThread();
Sleep(1);
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CXXXDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CXXXView));
AddDocTemplate(pDocTemplate);
................
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
if(m_pShowThread)
m_pShowThread->HideDialog();
}
int CXXXApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
if(m_pShowThread)
m_pShowThread->PostThreadMessage(WM_QUIT,0,0);
return CWinApp::ExitInstance();
}