gpt4 book ai didi

c++ - 实现涉及 Windows HANDLE 对象的复制构造函数

转载 作者:行者123 更新时间:2023-11-30 01:23:53 25 4
gpt4 key购买 nike

我是使用 win32 API 的新手,所以请多多包涵。

我目前正在从事一个涉及 Winsock 的 C++ 项目,但我对使用复制构造函数的事件对象 HANDLE 类型的正确方法感到困惑。

概述(代码如下):在尝试使用 IOCP 并保持一切可伸缩时,我有一个线程检查多个接受事件。每个 ServerConnection 对象都拥有自己的由 WSACreateEvent() 创建的接受事件对象、其关联的低级套接字和相关状态/变量。

我的问题是,我正在尝试实现“三巨头”,但我不太确定应该如何“复制”句柄。

DuplicateHandle() 似乎创建了一个新句柄,但它指向同一个对象,但这在 ServerConnection“复制”方面没有意义(我们想要一个具有相同状态的新对象,对吧?) .

至于使用复制赋值运算符,我不确定它会对事件对象 HANDLE 做什么。

服务器连接.h

class ServerConnection
{
public:
//...constructors, destructors, etc...

virtual HANDLE getAcceptEvent();

virtual void setAcceptEvent(HANDLE eventObj);

protected:

private:

HANDLE assocAcceptEvent;

//..other variables...
};

服务器连接.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
}

最佳答案

您无法以合理的方式复制句柄这一事实(即 DuplicateHandle 不会执行您想要的操作)让我认为该对象不应该是可复制的。 ..

你要问自己的问题是:ServerConnection 的拷贝实际上意味着什么?你会在哪里/如何使用它?

我不知道答案,因为我不知道您的总体设计对 ServerConnection 意味着什么 - 但事实上它说 ServerConnection 让我认为它是“连接”到某物的东西,因此不能轻易复制。

关于c++ - 实现涉及 Windows HANDLE 对象的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14367888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com