00001
00002
00003
00004
00005
00006 class CMsg {
00007 public:
00008 UINT uMsg;
00009 DWORD dwFlags;
00010 LPVOID lpParam;
00011 CAMEvent *pEvent;
00012
00013 CMsg(UINT u, DWORD dw, LPVOID lp, CAMEvent *pEvnt)
00014 : uMsg(u), dwFlags(dw), lpParam(lp), pEvent(pEvnt) {}
00015
00016 CMsg()
00017 : uMsg(0), dwFlags(0L), lpParam(NULL), pEvent(NULL) {}
00018 };
00019
00020 class AM_NOVTABLE CMsgThread {
00021 private:
00022 static DWORD WINAPI DefaultThreadProc(LPVOID lpParam);
00023 DWORD m_ThreadId;
00024 HANDLE m_hThread;
00025
00026 protected:
00027
00028
00029
00030 CGenericList<CMsg> m_ThreadQueue;
00031 CCritSec m_Lock;
00032 HANDLE m_hSem;
00033 LONG m_lWaiting;
00034
00035 public:
00036 CMsgThread()
00037 : m_ThreadId(0),
00038 m_hThread(NULL),
00039 m_lWaiting(0),
00040 m_hSem(NULL),
00041
00042 m_ThreadQueue(NAME("MsgThread list"), 5)
00043 {
00044 }
00045
00046 ~CMsgThread();
00047
00048
00049 void virtual GetThreadMsg(CMsg *msg);
00050
00051
00052 virtual void OnThreadInit() {
00053 };
00054
00055 BOOL CreateThread();
00056
00057 BOOL WaitForThreadExit(LPDWORD lpdwExitCode) {
00058 if (m_hThread != NULL) {
00059 WaitForSingleObject(m_hThread, INFINITE);
00060 return GetExitCodeThread(m_hThread, lpdwExitCode);
00061 }
00062 return FALSE;
00063 }
00064
00065 DWORD ResumeThread() {
00066 return ::ResumeThread(m_hThread);
00067 }
00068
00069 DWORD SuspendThread() {
00070 return ::SuspendThread(m_hThread);
00071 }
00072
00073 int GetThreadPriority() {
00074 return ::GetThreadPriority(m_hThread);
00075 }
00076
00077 BOOL SetThreadPriority(int nPriority) {
00078 return ::SetThreadPriority(m_hThread, nPriority);
00079 }
00080
00081 HANDLE GetThreadHandle() {
00082 return m_hThread;
00083 }
00084
00085 DWORD GetThreadId() {
00086 return m_ThreadId;
00087 }
00088
00089 void PutThreadMsg(UINT uMsg, DWORD dwMsgFlags,
00090 LPVOID lpMsgParam, CAMEvent *pEvent = NULL) {
00091 CAutoLock lck(&m_Lock);
00092 CMsg* pMsg = new CMsg(uMsg, dwMsgFlags, lpMsgParam, pEvent);
00093 m_ThreadQueue.AddTail(pMsg);
00094 if (m_lWaiting != 0) {
00095 ReleaseSemaphore(m_hSem, m_lWaiting, 0);
00096 m_lWaiting = 0;
00097 }
00098 }
00099
00100
00101
00102
00103
00104 virtual LRESULT ThreadMessageProc(
00105 UINT uMsg, DWORD dwFlags, LPVOID lpParam, CAMEvent *pEvent) = 0;
00106 };
00107