我不熟悉網絡編程,尤其是異步過程。 也開始新的與升壓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