我不熟悉网络编程,尤其是异步过程。 也开始新的与升压LIB对于boost-asio网络编程什么是处理响应的最佳方法?
进出口实现类,来访问IMAP服务器。我可以发送和接收 命令和响应,一般来说
响应在类中的出列队列中排队。 我把简单的响应线放在队列中,以便进一步处理。
现在处理排队响应的最佳方式是什么?
- 一个额外的线程检查(基于时间)队列,为新的条目?
- 每次将新条目推入队列时都会进行一些回调?
我该如何实现和集成这个回调?
也许有人对此有一个简单的例子。
由于
实施队列处理器我不熟悉网络编程,尤其是异步过程。 也开始新的与升压LIB对于boost-asio网络编程什么是处理响应的最佳方法?
进出口实现类,来访问IMAP服务器。我可以发送和接收 命令和响应,一般来说
响应在类中的出列队列中排队。 我把简单的响应线放在队列中,以便进一步处理。
现在处理排队响应的最佳方式是什么?
也许有人对此有一个简单的例子。
由于
实施队列处理器每当一个新的项目推到队列作出一些回调? 如何实现和集成此回调?
我假设你与单个线程同步连接工作。
做这样的事情:
class worker {
deque<message> messages;
bool is_writing_;
push_message(message msg) {
messages.push_back(msg);
notify();
}
void notify()
{
if(!is_writing_) {
is_writing_=true;
init();
}
}
void init()
{
if(messages.empty()) { is_writing_=false; return; }
messamge msg=messages.pop();
convert_to_vector(v);
async_write(socket,buffer(v),
boost::bind(&worker::complete,this,placehoders::error));
}
void complete(error_code const &e)
{
if(!e) {
init();
}
else { cleanup(); }
}
};
注意!
这是单线程执行。如果你想从另一个线程通知您应该 不叫some_worker->push_message(msg)
,你应该使用iosrvice:
service.post(boost::bind(&worker::push_message,some_worker,msg));
而且push_message
会从运行IOService的同一个线程调用。
一种可能的方式是使用一个信令信号量。
例如 的并行线程条件类型(description)如果你是一个POSIX兼容的平台。
你可以有“队列处理线程”在后台等待N多。
每当某个东西被推入队列时,信号量就会发送它的信号。
该信号由休眠“队列处理”线程接收,该线程开始处理队列,因为他们知道他们有数据。
当线程处理完它的数据,检查队列的大小,看它是否应该抓住别的东西,如果不是再回去等待信号。
连接self是异步的,我认为应该在另一个线程中工作,所以我举例说明一下,看看我有多远。 我在思考如何开始时遇到了错误。现在它更加清晰一些,将答案放在一个新的工作对象中。我只把它放在队列 谢谢 – 2009-04-18 18:43:21