www.pudn.com > WinGOS.rar > Thread.h


#ifndef _GOS_THREAD_H_ 
#define _GOS_THREAD_H_ 
 
#define Sleep(ms) g_pKernel->m_pCurThread->SleepEx(ms,FALSE); 
 
enum _tagThread 
{ 
	CreateSuspend =0x00004, 
	ThreadDefaultStackSize=256*1024-4, 
 
	msgCreateThread=MAKEMSG(PriorityNormal,MsgClassThread,1L), 
	msgExitThread, 
	msgRunThread, 
	 
	MsgQueueGrowSize=102, 
}; 
 
typedef struct _tagMSGLE 
{ 
	_tagMSGLE* pNext; 
	MSG msg; 
}MSGLE,*PMSGLE; 
 
class CThread : public CMsgObject 
{ 
	friend class CKernel; 
	friend class CHAL; 
	friend class CSyncObject; 
	friend class CCriticalSection; 
	friend class CMutex; 
	friend class CSemaphore; 
	friend class CEvent; 
public: 
	virtual LRESULT MsgProc(UINT message, WPARAM wParam, LPARAM lParam); //消息处理函数 
	int OnRun(PVOID pData); 
public: 
	int Run(PVOID pData) 
		{ return MsgProc(msgRunThread,WPARAM(pData),0); } 
	BOOL CreateThread(PVOID pParam,int nPriority,UINT nStackSize,int nFlags); 
	BOOL ExitThread(DWORD dwExitCode); 
	VOID SleepEx(LONG nMilliseconds,BOOL bSleepTo); 
	BOOL SetThreadPriority(int nPriority); 
	int GetThreadPriority(){ return m_nPriority; } 
	int GetLastError(){ return m_nErrCode; } 
	void SetLastError(int nErrCode){ m_nErrCode=nErrCode; } 
	HANDLE InsertMessage(CMsgObject* pObj,UINT nMessage,WPARAM wParam,LPARAM lParam); 
	HANDLE InsertMessage(CMsgObject* pObj,HANDLE hRefMsg,WPARAM wParam,LPARAM lParam); 
	void PulseMessage(HANDLE hMsg); 
	BOOL RemoveMessage(CMsgObject* pObj); 
	BOOL RemoveMessage(CMsgObject* pObj,UINT nMessage); 
	BOOL RemoveMessage(HANDLE hMsgFrom,HANDLE hMsgTo); 
	BOOL RemoveTimerMessage(CMsgObject* pObj,UINT nIDEvent); 
	void RemoveAllMessage(); 
	BOOL GetMessage(PMSG pMsg,LONG nTimeOut); 
	LRESULT DispatchMessage(const MSG *pMsg); 
	CThread(); 
private: 
	BOOL GrowMQBuffer(); 
private: 
	CThread* m_pNext; //同级线程 
	CSyncObject* m_pWaitObject;//等待对象 
	PVOID m_pStack;//CPU栈指针 
	CHeap m_heap; //线程堆 
	DWORD m_nWakeTime; //唤醒时间 
	USHORT m_nPriority;//优先级 
	USHORT m_nErrCode; //错误代码 
	CCriticalSection m_tlock; 
	PMSGLE m_pMQEntry; 
	PMSGLE m_pMQFree; 
	PMSGLE m_pMQBuffer; 
}; 
 
typedef CThread *PTHREAD; 
 
#endif //_GOS_THREAD_H_