在使用win32 API时,我是新手,所以请耐心等待。
我目前正在开发一个涉及Winsock的C ++项目,但是我对使用事件对象HANDLE类型与复制构造函数的正确方法感到困惑。
概述(代码如下):在尝试使用IOCP并保持一切可伸缩性时,我有一个检查多个接受事件的线程。每个ServerConnection对象都拥有自己的由WSACreateEvent()创建的accept事件对象,其关联的低级套接字以及相关的状态/变量。
我的问题是,我试图实现“三巨头”,我不太确定我应该如何'复制'手柄。
DuplicateHandle()似乎创建了一个新句柄,但它指向同一个对象,但就ServerConnection“copy”而言没有意义(我们想要一个具有相同状态的新对象,对吗?) 。
至于使用复制赋值运算符,我不确定它会对事件对象HANDLEs做什么。
ServerConnection.h
class ServerConnection
{
public:
//...constructors, destructors, etc...
virtual HANDLE getAcceptEvent();
virtual void setAcceptEvent(HANDLE eventObj);
protected:
private:
HANDLE assocAcceptEvent;
//..other variables...
};
ServerConnection.cpp
ServerConnection::ServerConnection(ServerConnection &that)
{
//blah blah...other vars
//? This does not seem right as the HANDLE is logically a pointer;
//Assigning like this just points another handle to the same event obj
//If the other ServerConnection object closes the handle...not good.
this.assocAcceptEvent = that.assocAcceptEvent;
//The only thing that make slightly more sense, is just to create a whole new one
//if I answered my own question, then great...but I wanted to make sure
this.assocAcceptEvent = WSACreateEvent();
//assume check for WSACreateEvent failing with WSAGetLastError() and
//handle appropriately
}
答案 0 :(得分:4)
你无法以合理的方式复制句柄(即DuplicateHandle
没有做你想做的事情),这让我觉得这个对象不应该是可复制的...... < / p>
您必须问自己的问题是: ServerConnection的副本实际上意味着什么? 你在哪里/怎么用它?
我不知道答案,因为我不知道你的整体设计是什么意思与ServerConnection有关 - 但事实上它说ServerConnection使我认为它是某种“连接”的东西,因此不能轻易复制。