SWFCDB的研究与探索 第5页
//_lIndexStartPos:(in) B+树索引在索引文件中的起始位置,
//_lIndexLength:(in) 用于创建B+树索引结点的文件空间
bool CreateBPTreeIndex(FILE *_file, long _lIndexStartPos, int iNodeCount );
//重载版本,功能同上
//iNodeCount:(in)B+树索引节点数
bool OpenBPTreeIndex(FILE *_file , long _lIndexStartPos );
//此函数打开B+树索引,然后可对索引文件进行操作
//file:(in)文件指针, _lIndexStartPos:(in) file所指文件中,B+树索引结构所在文件中位置
BPT_RET InsertBPTree(KeyType key[KSIZE], Record rec);
//将关键字 及其关键字标识记录在数据文件中的位置 插入索引表
BPT_RET DeleteKey(KeyType *key);
//删除关键字索引
BPT_RET TraverseBPTree();
//遍历B+树
BPT_RET Find(KeyType *key);
//搜索B+索引,查找与key匹配的节点,并将其rec返回
char *GetBPTreeLastError();
//返回最后一次错误信息
全部实现代码在 BPTreeIndex.h 和 BPTreeIndex.cpp 两个文件中
4.3 第二层实现
第二层管理第一层接口,并向用户提供可视化操作界面的功能,是在MFC(Microsoft Foundation Class Library)环境下实现的,提供可视化新建数据库,删除数据库,新建表,删除表,插入记录,返回记录等操作。
4.3.1 拆分窗口
利用MFC中的CSplitterWnd类[12]将一个窗口框架拆分成若干窗格,实现在同一窗体中显示多个视图。本程序将主界面拆分成服务器层次结构树视图和数据库子项列表视图两个窗格。如图 4 1 程序主界面所示。
4.3.2 服务器层次树视图
该视图类继承 CTreeCtrl 类[12],将数据库各层级已树状显示,如图 4 1 程序主界面左半部分所示。本视图提供新建数据库和删除数据库操作,实现代码分别在DBTreeView.h 和 DBTreeView.cpp 两个文件中。
图 4 1 程序主界面
4.3.3 数据库子项列表视图
该视图类继承 CListCtrl 类[12],将数据库子项以列表的形式显示,如图 4 1 程序主界面右边为数据库表项的列表显示。本视图提供新建表,删除表,插入记录,返回记录等操作,实现代码分别在DBListView.h 和 DBListView.cpp两个文件中。
4.3.4 表操作视图
该视图类直接继承 CView 类[12],显示表的结构信息和记录信息,并对新建表,插入记录,返回记录等操作的结果集实现图形化界面显示,如图 3 4 新建表或设计表视图,图 3 5 插入记录视图和图 3 6 返回记录视图所示。其功能实现代码分别在TableView.h 和 TableView.cpp 两个文件中。
说明:由于VC++中并不存在DataGrid 类来显示网格空件。这里使用了由Chris Maunder 开发的开源控件 MFC Grid Control 来显示网格数据。在初略学习了该控件后,添加了几个函数来满足本程序的功能的需要。
4.4 网络模型实现
4.4.1 完成端口内存管理接口
本接口主要提供以下六个函数实现缓冲区管理:
DWORD AddReference();
//添加对 完成端口内存管理接口 引用,引用次数自增1
DWORD Release();
//释放对 完成端口内存管理接口 引用,引用次数自减1;
//如果引用次数减到0,则释放该内存接口。如果一个线程添加了对该接口的引用,
//则必须调用Release()释放掉。
LPPER_IO_DATA GetPER_IO_DATA(DWORD dwThreadID);
//从系统预先"单句柄数据"缓冲区中得到一 "单句柄数据" 区
//如果成功,则返回缓冲区指针,否则返回NULL
void FreePER_IO_DATA(LPPER_IO_DATA pIO);
//将"单句柄数据"释放回系统预先"单句柄数据"缓冲区中
LPIOCP_OVERLAPPED_DATA GetIOCP_OVERLAPPED_DATA(DWORD dwThreadID);
//从系统预先分配的 IOCP重叠结构“单I/O操作数据”缓冲区取得一 IOCP重叠//结构“单I/O操作数据”;如果成功,返回指向一IOCP重叠结构“单I/O操作数//据”的指针;如果失败,返回NULL
void FreeIOCP_OVERLAPPED_DATA(LPIOCP_OVERLAPPED_DATA pIOD);
//将IOCP重叠结构“单I/O操作数据” 释放回IOCP重叠结构“单I/O操作数据”//缓冲区
4.4.2 完成端口服务器线程
服务器线程由以下两类服务器线程函数组成:
DWORD WINAPI ServerWorkerThread(LPVOID lParam)
//服务器工作者线程定义,负责接受和发送数据
DWORD WINAPI IOCPStartAsThread(LPVOID lParam)
//服务器控制线程,启动IOCP服务器
4.4.3 数据处理线程池
数据处理线程池由线程池管理者线程和线程池工作者线程组成,定义为:
DWORD WINAPI ThreadPoolWorker(LPVOID lParam)
//线程池工作者线程定义,负责处理服务器接收到的数据
DWORD WINAPI ThreadPoolManager(LPVOID lParam)
//线程池管理线程定义,负责分配工作者线程任务
下面为工作者线程参数结构定义:
typedef struct _THREAD_INFO //工作者 线程参数结构
{
CIocp *pIocp; //IOCP管理类指针
HANDLE hThread; //指向本线程句柄
HANDLE hEvent; //指向本线程同步EVENT核心对象(如果本Event进入传信状态,则说明本线程有待处理的数据)
HANDLE hEventWorkFinished; //指向线程当前任务是否完成(如果本Event进入传信状态,则说明本线程的数据处理完毕)
TASK_QUEUE_ITEM tqi; //待处理的任务
DWORD dwThreadID; //本线程ID
DWORD dwID; //本线程在线程数组中的编号
bool bExitThread; //true 则线程退出,false 继续执行
}THREAD_INFO,*LPTHREAD_INFO;
4.4.4 CIocp完成端口管理类
CIocp类管理并协调完成端口内存管理接口、完成端口服务器线程和数据处理线程池的正常工作,提供两种方案实现对接受的数据的处理,分别是回调机制和多态(即派生类重写CIocp类虚函数IOCPRecv()实现)。下面给出其定义:
class CIocp
{
public:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页