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