Re: CWinThread, CFrameWnd and memory leak???
On Feb 10, 6:25 am, Joseph M. Newcomer <newco...@flounder.com> wrote:
I had missed that the CFrameWnd is created in the secondary thread.
I agree with all the posts: bottom line, don't create windows in secondary=
threads,
especially not windows that are part of a critical framework like CFrameWn=
d.
Not sure why anyone would want to use MSCOMM for anything; it is so trivia=
l to write good
serial port code without it that I have no idea why anyone would want to u=
se it.
=
joe
On Sat, 09 Feb 2008 10:50:17 -0600, "Doug Harrison [MVP]" <d...@mvps.org> =
wrote:
On Sat, 9 Feb 2008 07:21:14 -0800 (PST), ole.tetzsch...@gmail.com wrote:
Hi
I guess it's just me being stupid, but I been googling and trying for
hours now and can't solve this problem myself.
The Problem is I have created a class (CmyUIthread) derived from
CWinThread, but when my test-app exit the compiler reports a memory
leak from a CFrameWnd object.
My test-app is just a dialog-app with 2 buttons. The first button just
create and starts the ui-thread:
m_p_thread = new CmyUIthread;
m_p_thread->CreateThread();
And the tread starts perfect :)
The second button stops the thread:
m_p_thread->PostThreadMessage( WM_QUIT,0,0);
And the thread stops :)
Use PostQuitMessage.
But when i quit my dlg-test-app the compiler reports the memory
leak???
I tried adding a third button that:
delete m_p_thread;
but this results in access violations.
The access violation occurs because you're relying on the auto-delete
behavior of CWinThread, which is a mistake. Go here for more:
http://members.cox.net/doug_web/threads.htm
CmyUIthread looks like this:
CmyUIthread::CmyUIthread()
{
}
CmyUIthread::~CmyUIthread()
{
}
BOOL CmyUIthread::InitInstance()
{
// TODO: perform and per-thread initialization here
CFrameWnd *wnd = new CFrameWnd;
wnd->Create( NULL, "myUIthread Window");
wnd->ShowWindow( SW_SHOW);
wnd->UpdateWindow();
m_pMainWnd = wnd;
return TRUE;
}
int CmyUIthread::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CmyUIthread, CWinThread)
END_MESSAGE_MAP()
What is wrong??? do I miss some cleanup???
Why are you creating windows in a secondary thread? It's preferable to ke=
ep
all the windows in the primary thread, where issues like this don't occur=
..
If you are leaking a CFrameWnd object, it is due to the window not
receiving the WM_NCDESTROY message or you overriding it and not calling t=
he
base version, which does "delete this". You should be able to set a
breakpoint in CFrameWnd::OnNcDestroy and verify it isn't being called. It=
may be that you need to call DestroyWindow on it before exiting your
secondary thread. The tidier way would be to post WM_CLOSE, but it is
possible the frame window will decline to close, so you'd have to check
this before using PostQuitMessage.
Joseph M. Newcomer [MVP]
email: newco...@flounder.com
Web:http://www.flounder.com
MVP Tips:http://www.flounder.com/mvp_tips.htm
Thank you all for the good feedback, I really appreciate it :)
I was wondering if I had to delete the "net CFrameWnd" but after
comparing it to a SDI application I could not find anywhere it was
deleted... guess that CWinApp deletes it???
My intention was to start a UI-thread with CFrameWnd and a CChildView
with no GUI (hidden anyway) and use CMCComm in that thread. The reason
for CMSComm for serial communication was just a habit... maybe it is
not a good way to do serial communication, but I had used it before in
single-thread app with satisfaction..
So maybe I should try something new :) anyway, I am still happy
that I learned a little about UI-thread :)
With kind regards, Ole :)