将 boost asio stream_handle与顺序的类似基于文件的设备一起使用
Using boost asio stream_handle with sequential like file based devices
我正在考虑使用 asio 在使用 CreateFile 创建的窗口"设备句柄"上执行"重叠"(完成端口)样式的 IO(...重叠...
不过,我有一个非常特殊的设计,由于我的应用程序的特殊性,我必须维护一个不同的线程池来执行数据的实际处理(工作池)和一个由处理池触发的实际 IO 完成池(一个非常小的池,可能只是一个线程)。
基本上,一开始我想触发一些从 IO 池发起的对我的设备的 IO 请求。当这些完成后,我会通知调度组件,该组件将完成数据包内容发布到工作池中的不同线程。这些完成通知会快速返回,因为实际处理将在工作池中发生> 并且在处理发生后从特定工作池线程启动新的"读取",该"读取"应在 io 池上触发完成。
使用窗口::stream_handle可以进行这种分离吗?通常,asio API 似乎将读取完成与流对象关联的相同io_service相关联。
编辑已经很长时间了,因为我已经实施了这种方法。我已经更新了我的回复以反映我的选择。
-
我使用窗口特定功能创建"设备"句柄:
句柄 file_handle = 创建文件(...FILE_FLAG_OVERLAPPED...
-
我可以将句柄与我的 ioService 关联/注册,以便对设备的所有重叠请求都由其中一个 ioService 线程处理。
error_code欧共体; 自动 &io_service_impl = use_service(IO服务); io_service_impl.register_handle(file_handle, ec);
-
然后,我可以使用重叠的 asio 从与 ioService.run() 不同的线程启动异步 IO,使其在 io 服务线程中触发完成:
void IoPool::InitiateNewRead() { service.post([this]() {auto handler = InterceptorReadHandler::Create(bufferPool, data, service); handler->SetContext(context); return device.Read(std::move(handler)); }); } }
-
作为设备读取实现的参考:
bool Device::Read(std::shared_ptr<InterceptorReadHandler> handler) { auto handlerWrapper = [handler](const boost::system::error_code &ec, std::size_t len) { handler->Completion(ec, len); }; win::overlapped_ptr overlapped(handler->GetService(), handlerWrapper); unsigned long bytesRead = 0; auto& packet = handler->GetBuffer(); auto ok = ::ReadFile(handle, packet.data, static_cast<DWORD> (packet.length), &bytesRead, overlapped.get()) ? true : false; auto lastError = ::GetLastError(); if (!ok && lastError != ERROR_IO_PENDING) { boost::system::error_code errCode(lastError, boost::system::get_system_category()); overlapped.complete(errCode, 0); return false; } else { overlapped.release(); } return true;
}
- 将 getline() 与文件一起使用
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- 我应该如何获取配置文件的绝对路径与 Windows .exe一起发布?
- 使用个人C++库编译代码时,与头文件一起使用时会中断
- 无法使包含.hpp文件与其中的2个文件一起使用
- 您是否必须随项目一起交付原型文件?
- 将boost::filtering_streambuf与newline_filter一起使用时为空文件
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- 如何制作一个与.txt文件一起使用的C 程序而不显示
- 将qresource qfile与文件一起使用
- 如何将boost::iostreams::mapped_file_source与gzip输入文件一起使用
- 在 C++ 中将 IFstream 与字符串而不是文件一起使用
- argv 和 argc 与输入/输出文件一起使用
- Visual Studio 2012将项目模板与文件一起导出
- 将HeaderDoc与.hpp文件而不是.h文件一起使用
- 使头文件与.cpp文件一起工作
- 试图与可执行文件一起使用gdb时出现问题
- 如何将fltk文件与其他文件一起编译
- 在带有Rcpp的R包中,将头(.h)文件与cpp文件一起使用
- rand()函数不能与文件I/O一起工作