================================================================================
标题: 对象状态示例类
作者: 叶飞虎
日期: 2020.01.31
基于对象状态类的示例类,可以根据示例类举一反三,充分提高多线程的并发能力。
对象状态示例类的头文件(DemoState.h)如下:
// =======================================
// Unit : 对象状态示例类
// Version: 1.0.0.0 (build 2020.01.31)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#ifndef _DemoState_H_
#define _DemoState_H_
#include "KYLib.h"
namespace demo
{
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TDemoState - TKYObjState 使用示例类 */
class TDemoState
{
public:
// 状态
enum TState
{
dsInactive = TKYObjState::osInactive, // 未启动
dsStopping = TKYObjState::osClosing, // 正在停止
dsStarting = TKYObjState::osOpening, // 正在启动
dsStarted = TKYObjState::osOpened, // 已经启动
};
private:
// 注: TItem 为假设类项
typedef TObject TItem;
typedef TKYMapIntKey TItems;
// 内部信息
typedef struct
{
DWord ID;
KYString Name;
KYString Password;
} TInfo;
private:
// 不支持对象拷贝
TDemoState(const TDemoState& obj) {}
public:
// 构造/析构函数
TDemoState();
virtual ~TDemoState();
// 属性
DWord ID() const { return FInfo.ID; }
KYString Name() const { return FInfo.Name; }
TState State() const { return (TState)FObjState.State(); }
// ??? ... ...
// 设置属性
void SetID(DWord AID);
void SetName(const KYString& AName);
void SetPassword(const KYString& APassword);
// ??? ... ...
// 启动/停止
bool Start(DWord AID, const KYString& AName, const KYString& APassword);
bool Start() { return FObjState.Open() == TKYObjState::orSuccess; }
void Stop(bool ANeedWait = false)
{ FObjState.Close(ANeedWait); }
// 示例方法
int OpenItem(const KYString& AFileName, unsigned AMode);
void CloseItem(int AItemID);
// 其它方法
void XXX();
// ??? ... ...
protected:
// 加锁/解锁
void Lock() { FObjState.Lock(); }
void Unlock() { FObjState.Unlock(); }
// 引用计数加/减 1
bool IncRefCount_Opening(){ return FObjState.IncRefCountGE(TKYObjState::osOpening); }
bool IncRefCount() { return FObjState.IncRefCount(TKYObjState::osOpened); }
void DecRefCount() { FObjState.DecRefCount(); }
// ??? ... ...
private:
// 执行初始化
void DoInit();
// 执行启动/停止
int DoStart(TInfo* AInfo);
void DoStop();
// 执行释放项的事件方法
void DoFreeItem(long AItemID, TItem* AItem);
// 执行断开连接的事件方法
// 注: 假设存在 OnDisconnect 事件
void DoDisconnect(void* Sender);
// ??? ... ...
private:
TInfo FInfo; // 信息项
TItems* FItems; // 项列表
TKYObjState FObjState; // 对象状态
// ??? ... ...
};
}
#endif
对象状态示例类的代码文件(DemoState.cpp)如下:
// =======================================
// Unit : 对象状态示例类
// Version: 1.0.0.0 (build 2020.01.31)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#include "DemoState.h"
namespace demo
{
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TDemoState - TKYObjState 使用示例类 */
// ---------------- 静态成员 ----------------
// ---------------- 静态函数 ----------------
// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TDemoState::TDemoState()
{
// 设置 FObjState 的回调方法
FObjState.SetDoOpen(this, (TKYObjState::TDoRet)&TDemoState::DoStart,
(TKYObjState::TDoNone)&TDemoState::DoStop,
(TKYObjState::TDoNone)&TDemoState::DoInit);
// 创建对象
FItems = new TItems(false, true, this, (TItems::TDoFree)&TDemoState::DoFreeItem);
// ??? ... ...
}
// 析构函数
TDemoState::~TDemoState()
{
// 停止, 注: 必须在其它对象释放前调用
Stop(true);
// 释放对象
FreeAndNil(FItems);
// ??? ... ...
}
// ---------------- 私有函数 ----------------
// 执行初始化
void TDemoState::DoInit()
{
// 清除项列表
FItems->Clear();
// ??? ... ...
}
// 执行启动
int TDemoState::DoStart(TInfo* AInfo)
{
// 初始化
int result = TKYObjState::orFailure;
// 判断是否通过参数传入
if (AInfo != NULL)
FInfo = *AInfo;
// 调用启动
printf(" >>> start {ID: %u, name: \"%s\"}\n", FInfo.ID, (const char*)FInfo.Name);
/*
if (_XXX_Start(FInfo.ID, FInfo.Name, FInfo.Password))
result = TKYObjState::orSuccess;
*/
// ??? ... ...
// 返回结果
return result;
}
// 执行停止
void TDemoState::DoStop()
{
printf(" <<< stop {ID: %u}\n", FInfo.ID);
/*
_XXX_Stop(FInfo.ID);
*/
// ??? ... ...
}
// 执行释放项的事件方法
void TDemoState::DoFreeItem(long AItemID, TItem* AItem)
{
printf(" ~~~ free-item {item-ID: %d, item: %p}\n", AItemID, AItem);
// 关闭项
/*
_XXX_CloseItem(AItemID);
*/
// 释放项对象
delete AItem;
}
// 执行断开连接的事件方法
// 注: 假设存在 OnDisconnect 事件
void TDemoState::DoDisconnect(void* Sender)
{
FObjState.SetClosed();
}
// ---------------- 保护函数 ----------------
// ---------------- 公有函数 ----------------
// 设置 ID 属性
void TDemoState::SetID(DWord AID)
{
Lock();
if (State() == dsInactive)
FInfo.ID = AID;
Unlock();
}
// 设置 Name 属性
void TDemoState::SetName(const KYString& AName)
{
Lock();
if (State() == dsInactive)
FInfo.Name = AName;
Unlock();
}
// 设置 Password 属性
void TDemoState::SetPassword(const KYString& APassword)
{
Lock();
if (State() == dsInactive)
FInfo.Password = APassword;
Unlock();
}
// 启动
bool TDemoState::Start(DWord AID, const KYString& AName, const KYString& APassword)
{
// 初始化
TInfo recInfo;
// 设置信息项
recInfo.ID = AID;
recInfo.Name = AName;
recInfo.Password = APassword;
// 打开
return FObjState.Open(&recInfo) == TKYObjState::orSuccess;
}
// 打开项
int TDemoState::OpenItem(const KYString& AFileName, unsigned AMode)
{
// 初始化
int result = -1;
KYString strFile = AFileName;
// 检查参数
if (strFile.Trim().Length() == 0)
result = -2;
else if (IncRefCount()) // 引用计数加 1
{
int intID = 0;
/*
intID = _XXX_OpenItem(AFileName, AMode);
*/
if (intID > 0)
{
// 初始化
TItem* objItem = NULL;
// 创建项对象
/*
try
{
objItem = new TItem(intID);
// ??? ... ...
}
catch (...) {}
*/
// 添加列表
if (objItem != NULL && FItems->Add(intID, objItem) != NULL)
result = intID;
else
{
// 关闭项
/*
_XXX_CloseItem(intID);
*/
// 释放项
if (objItem != NULL)
delete objItem;
}
}
else if (intID == 0)
result = 0;
// 引用计数减 1
DecRefCount();
}
// 返回结果
return result;
}
// 关闭项
void TDemoState::CloseItem(int AItemID)
{
// 检查参数并引用计数加 1
if (AItemID > 0 && IncRefCount())
{
// 删除项
FItems->Delete(AItemID);
// 引用计数减 1
DecRefCount();
}
}
// 其它方法
void TDemoState::XXX()
{
// 引用计数加 1
if (IncRefCount())
{
// 操作
// ??? ... ...
// 引用计数减 1
DecRefCount();
}
}
}
对象状态及示例代码(ObjState.rar)下载如下:
https://pan.baidu.com/s/1eTWTYD0#list/path=%2Fshares%2Fsources%2F_open
================================================================================