Procedure:
1. Run AppWizard(exe)—select SDI
2. Insert Resource Dialog IDD_DIALOG1
3. Modify the ThreadDialog and ThreadView files
4. Build and test the application.
ThreadDialog.h
#define WM_THREADFINISHED WM_USER+5
public:
int m_nTimer;
enum {nMaxCount=10000};
protected:
afx_msg LRESULT OnThreadFinished(WPARAM wParam,LPARAM lParam);
ThreadDialog.cpp
int g_nCount=0;
UINT ComputeThreadProc(LPVOID pParam)
{
volatile int nTemp;
for (g_nCount=0;g_nCount< CThreadDialog::nMaxCount;::InterlockedIncrement((long*)&g_nCount))
{
for (nTemp=0;nTemp<100000;nTemp++)
{
}
::PostMessage((HWND)pParam,WM_TIMER,0,0);
}
::PostMessage((HWND)pParam,WM_THREADFINISHED,0,0);
g_nCount=0;
return 0;
}
BEGIN_MESSAGE_MAP(CThreadDialog, CDialog)
ON_MESSAGE(WM_THREADFINISHED,OnThreadFinished)
END_MESSAGE_MAP()
void CThreadDialog::OnStart()
{ m_nTimer=SetTimer(1,10000,NULL);
ASSERT(m_nTimer != 0);
GetDlgItem(ID_START)->EnableWindow(FALSE);
AfxBeginThread(ComputeThreadProc,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
}
void CThreadDialog::OnCancel()
{
if (g_nCount ==0)
CDialog::OnCancel();
else
g_nCount=nMaxCount;
}
LRESULT CThreadDialog::OnThreadFinished(WPARAM wParam,LPARAM lParam)
{
CDialog::OnOK();
return 0;
}
void CThreadDialog::OnTimer(UINT nIDEvent)
{
CProgressCtrl* pBar=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pBar->SetPos(g_nCount*100/nMaxCount);
}
ThreadView.cpp
#include “ThreadDialog.h”
void CThreadView::OnLButtonDown(UINT nflags, CPOINT point)
{
CThreadDialog dlg;
dlg.DoModal();
}
Subscribe to:
Post Comments (Atom)

No comments:
Post a Comment