Re: Starting and ending a thread in a Dialog application
On Mon, 24 Nov 2008 04:32:25 -0800 (PST), hamishd <Hamish.Dean@gmail.com>
wrote:
I know i'm doing this wrong.. any advice?
What I want to achieve is this: I have a MFC Dialog application. When
the application is executed, some data is processed, and the
application exits. This can easily be done with no GUI. However, I use
a dialog application as I want the user to be able to stop the
processing at their own wish.
In the OnInitDialog() I start my worker thread. <<prob not the best
way, but it's the only way i know. the thread MUST automatically start
on execution of the application>>.
Once the thread has finished its task, I want to close the dialog and
end everything. The question is.. how?!? I am using EndDialog(), but I
do not think this is the best way?
The thread should post a user-defined message to the dialog just before it
exits, and the dialog should respond by exiting, but not before waiting on
the thread handle. For more on this, see:
http://members.cox.net/doug_web/threads.htm#Q8
If it's a modal dialog, EndDialog is fine. If modeless, you can use
DestroyWindow.
BOOL CMyAppDlg::OnInitDialog()
{
....
....
....
SendMessage(UWM_START_THREAD, 0, 0);
return TRUE;
}
BEGIN_MESSAGE_MAP(CMyAppDlg, CDialog)
//{{AFX_MSG_MAP(CMyAppDlg)
ON_MESSAGE(UWM_START_Thread, OnStart)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Stuff you add to the message map by hand does not go between the comment
blocks. You need to move it outside, e.g.
BEGIN_MESSAGE_MAP(CMyAppDlg, CDialog)
//{{AFX_MSG_MAP(CMyAppDlg)
//}}AFX_MSG_MAP
ON_MESSAGE(UWM_START_Thread, OnStart)
END_MESSAGE_MAP()
LRESULT CMyAppDlg::OnStart(WPARAM wp, LPARAM lp)
{
AfxBeginThread(StartThread, this);
return 0;
}
UINT StartThread(LPVOID pParam)
{
//do some data processing here....
//now finished, so end everything
pDlg->EndDialog(0);
Again, the thread should post a user-defined message to the dialog at this
point indicating that it is about to terminate. It should not call member
functions on windows created by another thread, because that tends to
create interthread SendMessage calls. Also, it's doubtful EndDialog is
thread-safe. Using PostMessage addresses both these concerns.
return 0;
}
You're making some mistakes with your CWinThread usage. To learn how to use
it safely and effectively, see:
http://members.cox.net/doug_web/threads.htm
--
Doug Harrison
Visual C++ MVP