实现了对IOCP的封装之后,以下是如何使用的示例:
/// 已处理的工作单元计数,在数据部分,不做事,只计数
TLockVar<int> processedWorkUnitNum;
/**
* 我的IOCP处理线程示例
*/
class TMyIOCPThread : public TIOCPThread<TPack<int> >
{
public:
TMyIOCPThread(TIOCPHandle<TPack<int> >* handle)
:TIOCPThread<TPack<int> >(handle)
{ /* 空的 */ }
virtual void initialize() { /* 没有什么好初始化的*/}
virtual void uninitialize() { /* 没有什么好销毁的*/ }
/// 处理工作单元
virtual void process(DWORD compley, TPack<int>* workunit)
{
TPack<>* pack = dynamic_cast<TPack<> *>(workunit);
if ( pack )
{
processedWorkUnitNum++; // 处理数据,这里简单进行数据
}
}
};
若要在TMyIOCPThread::process之前做判断,可以加响应TOnBeforeIOCPProcess事件:
/**
* 我的处理过程
*/
class TMyProcess : public TObject
{
public:
void beforeIOCPProcess(DWORD* compkey, TPack<int>* workunit, bool& option)
{
option = true; // 返回true,则TIOCPThread::process会继续处理,否则不处理
}
};
main函数:
int _tmain(int argc, _TCHAR* argv[])
{
TIOCPModel<TPack<int>, TMyIOCPThread> iocp; // IOCP封装
TMyProcess myprocess; // 我的处理过程
iocp.setOnBeforeIOCPProcess(&myprocess, static_cast<TIOCPModel<TPack<int>, TMyIOCPThread>::TOnBeforeIOCPProcess>(&TMyProcess::beforeIOCPProcess));
iocp.setEnabled(true); // 开始工作
while(!_kbhit()) ::Sleep(1); // 等待按键
return 0;
}
如何,使用起来是不是很简单?
以下是源代码下载
如果无法下载,请来信[email protected] 向我索取即可。