home *** CD-ROM | disk | FTP | other *** search
- // mtbounce.cpp : Implements the user interface thread for the
- // bounce window.
- //
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
- #include "bounce.h"
- #include "mtbounce.h"
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char BASED_CODE THIS_FILE[] = __FILE__;
- #endif
-
- // A single global event handle is used to synchronize the termination
- // of the application and the termination of bounce threads. This
- // synchronization avoids false memory leak detection of CBounceThread
- // objects that did not have time to be auto-destroyed before the
- // application terminates.
- //
- // The reason that m_hEventBounceThreadKilled cannot be a per-object member
- // variable of the CBounceThread object is because the event handle must
- // be referred to by the delete operator. By the time the delete operator
- // is called, the member variable no longer can be referenced. The reason
- // that it is permissable to use a global event, instead of per thread events,
- // is that each CBounceWnd window is destroyed in sequence, one after another.
- // Therefore, each CBounceThread is destroyed in sequence, one after another.
-
- HANDLE CBounceThread::m_hEventBounceThreadKilled;
-
- /////////////////////////////////////////////////////////////////////////////
- // CBounceThread
-
- IMPLEMENT_DYNCREATE(CBounceThread, CWinThread)
-
- CBounceThread::CBounceThread()
- {
- }
-
- CBounceThread::CBounceThread(HWND hwndParent) : m_hwndParent(hwndParent)
- {
- }
-
- CBounceThread::~CBounceThread()
- {
- }
-
- void CBounceThread::operator delete(void* p)
- {
- // The exiting main application thread waits for this event before completely
- // terminating in order to avoid a false memory leak detection. See also
- // CBounceWnd::OnNcDestroy in bounce.cpp.
-
- SetEvent(m_hEventBounceThreadKilled);
-
- CWinThread::operator delete(p);
- }
-
- int CBounceThread::InitInstance()
- {
- CWnd* pParent = CWnd::FromHandle(m_hwndParent);
- CRect rect;
- pParent->GetClientRect(&rect);
-
- BOOL bReturn = m_wndBounce.Create(_T("BounceMTChildWnd"),
- WS_CHILD | WS_VISIBLE, rect, pParent);
-
- // It is important to set CWinThread::m_pMainWnd to the user interface
- // window. This is required so that when the m_pMainWnd is destroyed,
- // the CWinThread is also automatically destroyed. For insight into
- // how the CWinThread is automatically destroyed when the m_pMainWnd
- // window is destroyed, see the implementation of CWnd::OnNcDestroy
- // in wincore.cpp of the MFC sources.
-
- if (bReturn)
- m_pMainWnd = &m_wndBounce;
-
- return bReturn;
- }
-
- int CBounceThread::ExitInstance()
- {
- return CWinThread::ExitInstance();
- }
-
- BEGIN_MESSAGE_MAP(CBounceThread, CWinThread)
- //{{AFX_MSG_MAP(CBounceThread)
- // NOTE - the ClassWizard will add and remove mapping macros here.
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CBounceThread message handlers
-