windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
windows DLL Is there are possibility to use same socket number among multiple threads or processes?
我已经创建了在windows资源管理器上更新ikon的应用程序(DLL)。我正在使用tcp套接字与服务器通信(在同一台计算机上)在那里我可以获得文件的状态。我在有很多文件的目录上遇到了性能问题(我从资源管理器中获得的文件名)。我发现了瓶颈,是客户端tcp/ip,在那里我初始化了tcp套接字。例如,如果我在目录上有50个文件,我将获得50个线程或进程,每个线程或进程初始化Winsock,然后将数据发送到服务器。
这是我注册服务器的DLL主目录STDAPI DllRegisterServer(无效)//注册组件。hr=RegisterInprocServer(szModule,CLSID_IconOverlay,L"LoqOverlayBlue.CustomIcon类",L"公寓");
以及我的CustomIcon类,其中IsMemberOf函数用于获取文件名,函数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++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- C++11标准和免费草案N3337之间的章节编号是否不同