www.pudn.com > 2003090514065121890.zip > spBaseLock.h


#ifndef __WYYRESMANBASE_H_ 
#define __WYYRESMANBASE_H_ 
#include  
/* 
version 0.9 BY wyy 2000/01/09 
定义最基本的基类 
version 2.0 by wenyy 2002/06/24  
修改成为DLL,然后 
*/ 
 
/* 
辅助类 
*/ 
//使用下面的代码来引用DLL 
/* 
#if defined(_DEBUG) 
	#pragma comment(lib, "spBase_D.lib") 
#else 
	#pragma comment(lib, "spBase.lib") 
#endif 
*/ 
namespace spBase 
{//定义名字空间 
 
class CAccessLock 
{ 
public: 
	//构造函数: 
	//pszProlog:名称后缀,对于同一种类型的所可以用不同的后缀来区分 
	//fAutoUnique:是否自动使用GUID来定义锁的名称,如果设置为TRUE可以避免因为对某个名称的锁重复创建而产生的错误 
	CAccessLock(LPCSTR pszProlog="ac",BOOL fAutoUnique=FALSE){strcpy(m_szProlog,pszProlog);};//throw(char*) 
	~CAccessLock(){}; 
//access control 
	virtual BOOL Visit(int iTime=1000*10)=0; 
	virtual BOOL LeaveVisit(void)=0; 
	virtual BOOL Access(int iTime=1000*10)=0; 
	virtual BOOL LeaveAccess(void)=0; 
protected: 
	virtual BOOL CreateObject(LPCSTR pszName,BOOL fAutoUnique=FALSE)=0; 
	virtual BOOL DeleteObject(void)=0; 
	char m_szProlog[40]; 
}; 
 
//排它锁 
class CSingleAccessLock : public CAccessLock 
{ 
public: 
	CSingleAccessLock(LPCSTR pszName,LPCSTR pszProlog="slock",BOOL fAutoUnique=FALSE);//throw(char*) 
	CSingleAccessLock(UINT uHandle,LPCSTR pszProlog="slock",BOOL fAutoUnique=FALSE);//throw(char*) 
	~CSingleAccessLock(); 
//access control 
	virtual BOOL Visit(int iTime=INFINITE); 
	virtual BOOL LeaveVisit(void); 
	virtual BOOL Access(int iTime=INFINITE); 
	virtual BOOL LeaveAccess(void); 
 
protected: 
	virtual BOOL CreateObject(LPCSTR pszName,BOOL fAutoUnique=FALSE); 
	virtual BOOL DeleteObject(void); 
 
protected: 
	//CRITICAL_SECTION m_csCtrl;//使用临界区会产生错误 
	HANDLE m_hMutex; 
}; 
 
//读写锁 
class CRWAccessLock : public CAccessLock 
{ 
public: 
	CRWAccessLock(LPCSTR pszName,LPCSTR pszProlog="rwlock",BOOL fAutoUnique=FALSE);//throw(char*) 
	CRWAccessLock(UINT uHandle,LPCSTR pszProlog="rwlock",BOOL fAutoUnique=FALSE);//throw(char*) 
	~CRWAccessLock(); 
//access control 
	virtual BOOL Visit(int iTime=INFINITE); 
	virtual BOOL LeaveVisit(void); 
	virtual BOOL Access(int iTime=INFINITE); 
	virtual BOOL LeaveAccess(void); 
 
protected: 
	virtual BOOL CreateObject(LPCSTR pszName,BOOL fAutoUnique=FALSE); 
	virtual BOOL DeleteObject(void); 
 
protected: 
	//CRITICAL_SECTION m_csCtrl;//使用临界区会产生错误 
	HANDLE m_hMutexRead,m_hMutexWrite; 
	UINT m_uReadCounter; 
}; 
 
//句柄序号产生器 
class CSequenceGenerator 
{ 
public: 
	CSequenceGenerator(LPCSTR pszSeqName="global_seq_handle",LPCSTR pszProlog="seq",BOOL fAutoUnique=FALSE):m_lockSeq(pszSeqName,pszProlog,fAutoUnique) 
	///////////////////////////////////////////////////// 
	//序号产生器 
	{ 
		m_uSeq=0; 
	} 
	~CSequenceGenerator(){}; 
	void SetCurrent(UINT uSeq=0) 
	{ 
		m_lockSeq.Access(); 
		m_uSeq = uSeq; 
		m_lockSeq.LeaveAccess(); 
	} 
	UINT GetCurrent(void) 
	{ 
		m_lockSeq.Visit(); 
		UINT uCurrent=m_uSeq; 
		m_lockSeq.LeaveVisit(); 
		return uCurrent; 
	}; 
	UINT GetNext(void) 
	{ 
		m_lockSeq.Access(); 
//		Sleep(1000); 
		UINT uCurrent=++m_uSeq; 
		m_lockSeq.LeaveAccess(); 
		return uCurrent; 
	} 
protected: 
	UINT m_uSeq; 
	CSingleAccessLock m_lockSeq; 
}; 
 
//辅助函数 
//保证唯一进程实例 
//如果有相同名称的进程在运行,软件会强制退出 ExitProcess() 
extern "C" void GlobalOpenUniqueProcess(LPCSTR pszName); 
/* 
class CIniWrap 
{ 
public: 
	CIniWrap(); 
	CIniWrap(LPCSTR pszFile); 
	~CIniWrap(); 
public: 
	//设置INI 文件名 
	void SetFile(LPCSTR pszFile); 
	BOOL ReadStr(LPCSTR pszSection,LPCSTR pszKey,char* pszBuf,int iLen=400); 
	BOOL ReadStr(LPCSTR pszSection,LPCSTR pszKey,CString& szBuf); 
	BOOL ReadInt(LPCSTR pszSection,LPCSTR pszKey,int& iRet,int iDefault=-1); 
protected: 
	CString m_szIniFile; 
}; 
*/ 
}//完成名字空间定义 
#endif