gpt4 book ai didi

c++ - windows DLL 是否有可能在多个线程或进程中使用相同的套接字号?

转载 作者:行者123 更新时间:2023-11-28 06:18:28 28 4
gpt4 key购买 nike

我已经创建了应用程序 (DLL) 来更新 Windows 资源管理器上的图标。我正在使用 tcp 套接字与服务器通信(在同一台计算机上) 我在哪里获得文件的状态。我在包含许多文件(我从资源管理器获取的文件的名称)的目录上遇到性能问题。我发现瓶颈是客户端 tcp/ip,我在其中初始化 tcp 套接字。例如,如果我在目录中有 50 个文件,我将获得 50 个线程或进程,每个线程或进程初始化 Winsock,然后将数据发送到服务器。

这是我注册服务器的主要 DLL STDAPI DllRegisterServer(无效) //注册组件。 hr = RegisterInprocServer(szModule, CLSID_IconOverlay, L"LoqOverlayBlue.CustomIcon类", L"公寓");

还有我的带有 IsMemberOf 函数的 CustomIcon 类,我在其中获取文件名和函数 GetStatus,我在其中通过发送到服务器来处理文件以获取文件的状态 //获取文件的状态。 HRESULT CustomIcon::IsMemberOf(PCWSTR pwszPath, DWORD dwAttrib) {

std::string fileName;
HRESULT result = S_FALSE;

std::size_t found = fileName.find("my directory");

if (found != std::string::npos) {
fileName.append("2;");
fileName.append(CT2A(pwszPath));
if (GetStatus(fileName) == Red) {
return S_OK;
}
}

return S_FALSE;
}

每次单击 Windows 资源管理器上的刷新按钮或单击目录时都会调用函数 IsMemberOf(),并且我会获取该目录中的所有文件。在 GetStatus 函数中,我初始化 winsock 并将文件名发送到服务器以获取文件的状态,以便更新 Windows 资源管理器上的图标。

问题我不知道是线程还是进程。有谁知道它是线程还是进程?在这种特殊情况下,是否有可能在多个线程或进程之间使用相同的套接字号?

最佳答案

您可以跨线程共享同一个套接字句柄。每个文件都有一个线程是有特定原因的吗?

与其在线程之间共享套接字编号,不如创建一个与负责套接字的单个通信线程相关联的队列可能更好。通过这种方式,您可以以一种无阻塞的方式将每个文件名发送到队列,并让套接字线程与服务器进行通信。如果您需要返回图标资源,您可以让线程等待来自套接字服务器的信号,通知资源准备就绪。

更新

如果你按照这种设计,让那么多线程等待一个线程是没有用的。您可以使用从套接字线程更新的另一个队列来存储到达的图标,一个扫描文件名的线程和另一个线程从第二个队列更新图标。按照此模式,只需要 3 个线程(如果将套接字线程分为写入线程和读取线程,则可能需要 4 个)。

关于c++ - windows DLL 是否有可能在多个线程或进程中使用相同的套接字号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29780951/

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