我想使用boost asio創建一個http客戶端。爲了進行結構化和優化,我研究了boost asio的示例,以瞭解一個好的實現應該是什麼樣的。啓動boost時的例程:: asio :: io_service
大多數情況下,我遵循HTTP Server的結構,所以我有一個連接管理器,它擁有一組指向每個單獨連接的指針。現在,這裏的大不同的是,已經在server.cpp的構造異步函數被調用,即
acceptor_.async_accept(new_connection_->socket(), boost::bind(&server::handle_accept, this, boost::asio::placeholders::error));
,並在io_service對象是通過函數調用服務器啓動winmain.cpp ::運行( ):
io_service_.run();
在我的實現,因爲它是一個客戶端,而不是服務器,我想等待用戶調用的send()函數之前,我開始連接到服務器。因此,我已將所有連接到服務器的函數調用移入連接類。當用戶請求到MSG發送到以下稱爲服務器:
resolver.async_resolve(query, boost::bind(&connection::handle_resolve, boost::ref(*this), boost::asio::placeholders::error, boost::asio::placeholders::iterator)); io_service_.run();
我想開始在一個單獨的線程每一個連接對象,這真的是我的問題的背景。我該怎麼做才能獲得結構化和優化的代碼?
我試過了,例如HTTP Server 2的例子,設置一個io_services的線程池並分配工作給他們,這樣他們纔會返回,直到停止。這似乎是一個好主意,因爲我會讓io服務始終在後臺運行。因此,我從我相當於server.cpp啓動線程池,在一個線程:
boost::thread t(boost::bind(&geocast::enabler::io_service_pool::run, &io_service_pool_));
,但是從我自己的試驗和錯誤分析,似乎之前,你已發出異步函數無法啓動io_service對象, 真的嗎?因爲我的程序卡住了。在我的情況下,我只想在用戶意味着發送POST請求或GET請求時調用async_resolve。支持我的理論; Chat Client首先調用一個async_connect並以async_read作爲回調,這樣他們就可以在創建客戶端之後安全地調用io_service.run()。我不希望從服務器讀取所有時間,只是爲了能夠啓動io_service,因爲這不是普通客戶端的工作方式,對吧?如果瀏覽器沒有從用戶導航到網站的每個可能的服務器上讀取數據......
如果我不使用示例2中的線程池,而是在單獨的類中啓動每個連接類,每個擁有自己的io_service,一切正常。但是,使用簡單的循環程序來選擇合適的io_service的線程池看起來非常有吸引力。對於我來說,多線程的最佳方法是什麼?我只是挑剔,應該堅持一個連接一個io_service的東西?
感謝您的好評!關於io_service :: run():我的意思是「無法啓動io_service BEFORE」是這樣的:我首先創建一個客戶端對象,它有一個在線程中運行的函數。之後,我調用客戶端類中的send()函數。現在,這變得棘手。在客戶端類中,調用async_resolve()。同時,在主線程中,io_service以run()方式啓動,即在主線程中首先調用send()函數,然後調用io_service.run()。但該計劃只是卡住了。爲什麼?看起來工作()沒有幫助... – 2011-05-18 13:22:05
@Thomas問一個新問題,根據評論我不清楚你想要完成什麼。 – 2011-05-18 16:19:29