2009-04-18 57 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. 每當某個東西被推入隊列時,信號量就會發送它的信號。

    • 該信號由休眠「隊列處理」線程接收,該線程開始處理隊列,因爲他們知道他們有數據。

    • 當線程處理完它的數據,檢查隊列的大小,看它是否應該抓住別的東西,如果不是再回去等待信號。

相關問題