//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: dsthread.h // //-------------------------------------------------------------------------- #ifndef __DSTHREAD_H__ #define __DSTHREAD_H__ //////////////////////////////////////////////////////////////////// // thread messages // dispatcher thread posts to worker thread to run query #define DISPATCH_THREAD_RUN_MSG (WM_USER + 100) // worker thread posts to dispatcher thread once done with the query #define DISPATCH_THREAD_DONE_MSG (WM_USER + 101) // worker thread posts to dispatcher thread to ack startup #define WORKER_THREAD_START_MSG (WM_USER + 102) // message posted to threads to ask for shutdown #define THREAD_SHUTDOWN_MSG (WM_USER + 103) // message posted to threads to ack shutdown #define THREAD_SHUTDOWN_ACK_MSG (WM_USER + 104) void WaitForThreadShutdown(HANDLE* hThreadArray, DWORD dwCount); //////////////////////////////////////////////////////////////////// // forward declarations class CDSComponentData; //////////////////////////////////////////////////////////////////// // CHiddenWnd class CHiddenWnd : public CWindowImpl { public: DECLARE_WND_CLASS(L"DSAHiddenWindow") static const UINT s_ThreadStartNotificationMessage; static const UINT s_ThreadTooMuchDataNotificationMessage; static const UINT s_ThreadHaveDataNotificationMessage; static const UINT s_ThreadDoneNotificationMessage; static const UINT s_SheetCloseNotificationMessage; static const UINT s_SheetCreateNotificationMessage; static const UINT s_RefreshAllNotificationMessage; static const UINT s_ThreadShutDownNotificationMessage; CHiddenWnd(CDSComponentData* pCD) { ASSERT(pCD != NULL); m_pCD = pCD; } BOOL Create(); // message handlers LRESULT OnThreadStartNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnThreadTooMuchDataNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnThreadHaveDataNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnThreadDoneNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnSheetCloseNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnSheetCreateNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnRefreshAllNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnThreadShutDownNotification(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); BEGIN_MSG_MAP(CHiddenWnd) MESSAGE_HANDLER( CHiddenWnd::s_ThreadStartNotificationMessage, OnThreadStartNotification ) MESSAGE_HANDLER( CHiddenWnd::s_ThreadTooMuchDataNotificationMessage, OnThreadTooMuchDataNotification ) MESSAGE_HANDLER( CHiddenWnd::s_ThreadHaveDataNotificationMessage, OnThreadHaveDataNotification ) MESSAGE_HANDLER( CHiddenWnd::s_ThreadDoneNotificationMessage, OnThreadDoneNotification ) MESSAGE_HANDLER( CHiddenWnd::s_SheetCloseNotificationMessage, OnSheetCloseNotification ) MESSAGE_HANDLER( CHiddenWnd::s_SheetCreateNotificationMessage, OnSheetCreateNotification ) MESSAGE_HANDLER( CHiddenWnd::s_RefreshAllNotificationMessage, OnRefreshAllNotification ) MESSAGE_HANDLER( CHiddenWnd::s_ThreadShutDownNotificationMessage, OnThreadShutDownNotification ) END_MSG_MAP() private: CDSComponentData* m_pCD; }; //////////////////////////////////////////////////////////////////// // CBackgroundThreadBase class CBackgroundThreadBase : public CWinThread { public: CBackgroundThreadBase(); ~CBackgroundThreadBase(); BOOL Start(HWND hWnd, CDSComponentData* pCD); virtual BOOL InitInstance();// MFC override virtual int ExitInstance(); virtual int Run() { return -1;} // // MFC override, need to override protected: BOOL PostMessageToWnd(UINT msg, WPARAM wParam, LPARAM lParam); HWND GetHiddenWnd() { ASSERT(m_hWnd!= NULL); return m_hWnd;} CDSComponentData* GetCD() { ASSERT(m_pCD); return m_pCD;} virtual void PostExitNotification() {} private: HWND m_hWnd; // hidden window handle CDSComponentData* m_pCD; }; //////////////////////////////////////////////////////////////////// // CBackgroundThreadInfo enum ThreadState { notStarted=0, running, busy, shuttingDown, terminated }; struct CBackgroundThreadInfo { CBackgroundThreadInfo(); UINT m_nThreadID; // thread ID if the thread HANDLE m_hThreadHandle; // thread handle of the thread ThreadState m_state; CBackgroundThreadBase* m_pThreadObj; // pointer to the thread object }; //////////////////////////////////////////////////////////////////// // CDispatcherThread class CDispatcherThread : public CBackgroundThreadBase { public: CDispatcherThread(); ~CDispatcherThread(); virtual int Run(); protected: virtual void PostExitNotification(); private: UINT GetThreadEntryFromPool(); void ReturnThreadToPool(UINT nThreadID); BOOL BroadcastShutDownAllThreads(); BOOL MarkThreadAsTerminated(UINT nThreadID); void WaitForAllWorkerThreadsToExit(); UINT _GetEntryFromArray(); UINT m_nArrCount; CBackgroundThreadInfo* m_pThreadInfoArr; }; //////////////////////////////////////////////////////////////////// // CWorkerThread class CWorkerThread : public CBackgroundThreadBase { public: CWorkerThread(UINT nParentThreadID); ~CWorkerThread(); virtual int Run(); void AddToQueryResult(CUINode* pUINode); void SendCurrentQueryResult(); BOOL MustQuit() { return m_bQuit; } protected: virtual void PostExitNotification(); private: UINT m_nParentThreadID; BOOL m_bQuit; CThreadQueryResult* m_pCurrentQueryResult; WPARAM m_currWParamCookie; const int m_nMaxQueueLength; }; ////////////////////////////////////////////////////////////////////// #endif // __DSTHREAD_H__