2009-12-29 99 views
1

我已經使用wininet發送一些同步的HTTP請求。現在,我想更進一步,想要異步請求一些內容。使用wininet的異步請求

目標是獲得「反向代理」狀的東西。我發送一個HTTP請求,延遲得到答覆 - 只要有人想聯繫我。我的線程應該繼續,因爲在此期間沒有任何內容,並且一旦響應到達,應該在此線程中調用回調。請注意,我不想要第二個處理回覆的線程(如果有必要,它應該只提供一些中斷主線程來調用回調的機制)!

更新:也許,來形容我想要的最好的辦法就是像在JavaScript中,你只有一個線程,但可以發送AJAX請求,然後導致回調被調用這個主線程的行爲。

因爲我想了解它是如何工作的,所以我不需要庫解決方案。有誰知道一些很好的教程,它解釋瞭如何實現我想要的行爲?

+0

如果你不想有第二個線程,你顯然需要一些同步機制來檢索調用該請求的線程中的通知 - 沒有什麼神奇的方法來調用忙於其他線程的回調的東西。 – 2009-12-29 22:43:40

+0

因此,InternetSetStatusCallback啓動一個新的線程?你會建議什麼同步機制? – Etan 2009-12-29 22:54:19

+0

「WaitForSingleObject」等似乎不適合,因爲我不知道什麼時候需要等待。我需要更多的「推」式同步機制,它會中斷主線程來調用我的回調 – Etan 2009-12-29 23:12:27

回答

1

我的線程應該繼續,如果有 沒什麼的同時,和 回調應在此 線程儘快被稱爲響應 到達。

你在這裏要求的基本上是COME FROM(而不是轉到)。這是一個真正不存在的神祕教學。調用代碼的唯一方法是在發佈線程中進行輪詢,或者讓一個單獨的線程執行同步IO,然後在結果中執行回調(在該線程中或在另一個衍生線程中) 。

當我使用套接字在C++中工作時,我設置了一個專用線程來遍歷所有打開的套接字,輪詢可用的數據而不會阻塞,獲取數據並將其填充到緩衝區中,並將緩衝區在特定情況下的回調(EOL,EOF等)。

1

除非你的主線程正在偵聽類似消息隊列的東西,否則沒有辦法只是劫持它並啓動它執行的代碼,而不是它正在執行的代碼。看看boost :: asio是如何工作的,它基本上可以讓你異步地進行連接,讀取,寫入等......例如,你用主(或任何)線程開始一個異步讀取,然後使用asio重疊IO以要求操作系統通知IO完成。異步讀取完成後,您的回調將由其中一個工作線程執行。

所有你需要做的就是確保調用io_service :: run()與主線程或工作線程來處理IO完成隊列。您調用的任何線程都將執行回調。

如果遵循規則,Asio有一些保證可以使這種多線程方法相當健壯。

即使您不打算使用它,也可以查看documentation for asio,如果您想要解決這個問題,很多模式和想法都非常有趣。

如果您不想看它,請記住,在Windows上,執行異步IO的方法稱爲「Overlapped IO」。