Re: Problem with MFC Thread
If it was me I would do it this way.
LRESULT CProgressBarExampleDlg::OnStepProgress(WPARAM,LPARAM)
{
m_Progress.StepIt();
return 1;
}
LRESULT CProgressBarExampleDlg::OnThreadDone(WPARAM,LPARAM)
{
m_PauseButton.EnableWindow(FALSE);
m_StopButton.EnableWindow(FALSE);
m_StartButton.EnableWindow(TRUE);
return 1;
}
void CProgressBarExampleDlg::OnBnClickedStart()
{
m_Progress.SetRange(0,180);
m_Progress.SetStep(1);
m_Progress.SetPos(0);
m_PauseButton.EnableWindow(TRUE);
m_StopButton.EnableWindow(TRUE);
m_StartButton.EnableWindow(FALSE);
m_Stop = FALSE;
m_Paused = FALSE;
AfxBeginThread(ThreadFunction,this);
}
void CProgressBarExampleDlg::OnBnClickedPause()
{
m_Paused = !m_Paused;
m_PauseButton.SetWindowText(m_Paused ? _T("Resume") : _T("Pause"));
}
void CProgressBarExampleDlg::OnBnClickedStop()
{
m_Stop = TRUE;
}
UINT __cdecl ThreadFunction(LPVOID lpParam)
{
CProgressBarExampleDlg *pDlg = (CProgressBarExampleDlg *)lpParam;
ASSERT(pDlg != NULL);
int Count = 0;
while (Count < 180 && !pDlg->m_Stop)
{
if (pDlg->m_Paused)
{
continue;
}
pDlg->SendMessage(WM_STEPPROGRESS);
Sleep(10);
Count++;
}
pDlg->SendMessage(WM_THREADDONE);
return 1;
}
You can download the sample app from here:
http://www.learnstar.com/AliR/ProgressBarExample
AliR.
"Lucress Carol" <incognito.me@gmx.de> wrote in message
news:6c0c5db3-6262-4f44-9bae-78342b9d68de@e53g2000hsa.googlegroups.com...
Hi everyone,
I've created a MFC Dialog with a Progress Bar Control, a Stop Button
and a Start Buttton.The idea is to start the progress bar Control by
clicking on the Start Button and I would like to pause (Stop Button)
the process at anytime and continue it when I click on the Start
Button again.
I 'm able to stop the process of the Progress Bar but when I try to
continue the process the whole thing crash...
Here is how my code looks like:
// CProgressBarExampleDlg.h
class CProgressBarExampleDlg : public CDialog
{
public :
CProgressBarExampleDlg(CWnd* pParent = NULL);
UINT Execute(); // here should be the process of the Progress Bar
executed
static UINT WorkerThreadLauncher(LPVOID pvParam);
HANDLE m_hEndThread;
...
...
protected:
void ProcessMessage();
volatile bool m_StopThread;
CWinThread* m_Thread;
...
...
};
//CProgressBarExampleDlg.cpp
BOOL CProgressBarExampleDlg::OnInitDialog()
{
...
m_progress.SetRange(5, 100);
m_StopThread=false;
HANDLE m_hEndThread = CreateEvent(0, TRUE, FALSE, 0);
...
return TRUE;
}
void CProgressBarExampleDlg::ProcessMessage()
{
MSG msg;
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
UINT CProgressBarExampleDlg::WorkerThreadLauncher(LPVOID pvParam)
{
CProgressBarExampleDlg* pThreadInstance=
reinterpret_cast<CProgressBarExampleDlg*>(pvParam);
return pThreadInstance->Execute();
}
UINT CProgressBarExampleDlg::Execute()
{
int i, count;
count=0;
while (count< 180 && !m_StopThread)
{
for (i=0;i<30;i++)
{
m_progress.SetPos(i+10);
Sleep(10);
}
count++;
ProcessMessage();
}
return 0;
}
void CProgressBarExampleDlg::OnBnStart()
{
this->m_Thread=AfxBeginThread(WorkerThreadLauncher,this);
}
void CProgressBarExampleDlg::OnBnStop()
{
MSG msg;
DWORD dwResult = WaitForSingleObject( m_hEndThread, 0 );
if ( dwResult =! WAIT_OBJECT_0 )
{
this->m_StopThread = true;
}
}
I guess in the OnBnStart() function I maybe need a if-clause to start
the process again when it has been previously interrupted?
Does someone have a suggestion?
Thank you
Lucress