2009-04-18 50 views
1

我不熟悉网络编程,尤其是异步过程。 也开始新的与升压LIB对于boost-asio网络编程什么是处理响应的最佳方法?

进出口实现类,来访问IMAP服务器。我可以发送和接收 命令和响应,一般来说

响应在类中的出列队列中排队。 我把简单的响应线放在队列中,以便进一步处理。

现在处理排队响应的最佳方式是什么?

  1. 一个额外的线程检查(基于时间)队列,为新的条目?
  2. 每次将新条目推入队列时都会进行一些回调?
    我该如何实现和集成这个回调?

也许有人对此有一个简单的例子。

由于

实施队列处理器

回答

1

每当一个新的项目推到队列作出一些回调? 如何实现和集成此回调?

我假设你与单个线程同步连接工作。

做这样的事情:

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的同一个线程调用。

+0

连接self是异步的,我认为应该在另一个线程中工作,所以我举例说明一下,看看我有多远。 我在思考如何开始时遇到了错误。现在它更加清晰一些,将答案放在一个新的工作对象中。我只把它放在队列 谢谢 – 2009-04-18 18:43:21

1

一种可能的方式是使用一个信令信号量。

例如 的并行线程条件类型description)如果你是一个POSIX兼容的平台。

你可以有“队列处理线程”在后台等待N多。

  1. 每当某个东西被推入队列时,信号量就会发送它的信号。

    • 该信号由休眠“队列处理”线程接收,该线程开始处理队列,因为他们知道他们有数据。

    • 当线程处理完它的数据,检查队列的大小,看它是否应该抓住别的东西,如果不是再回去等待信号。

相关问题