2013-10-14 67 views
1

以下是情況。客戶端使用java開發,服務器使用C++(Windows平臺)。通信以請求和響應方式使用服務調用進行。但是這些呼叫是同步的。客戶端發起請求調用,服務器處理請求併發送響應。直到那時客戶端被阻止。在C++中進行異步同步調用

提供了可用於報告客戶端UI進度的任務。這消除了客戶端等待服務器響應的需要。

我最初對這個問題的看法是,在分離模式下做一個單獨的線程。向客戶發送您的請求已被採取的響應。在線程中產生一個任務,該任務將持續報告UI中的進度。

但問題是,這是長期的最佳方法嗎?或者應該有一個徹底的工作來達到異步涅??

+0

你如何跟蹤進度?通過單獨的回調?或者,一項重大任務是否被分割成許多小計劃? – Fildor

+0

@Fildor在服務器端,我生成了一個支持框架的任務對象,並使用它的進度更新方法顯示進度。 – deepdive

+0

好吧,那麼你可以使用ExecutorService和Callables ... – Fildor

回答

0

現在通常的模式似乎是在單獨的線程中運行阻塞IO,然後使用在主線程上運行的回調/觀察器。這種模式與在主線程上運行所有GUI工作的現代最佳實踐完美結合。

編輯:

對不起,錯過該服務器是在C++中。

爲了澄清...

在客戶端你有兩個線程。 GUI和交互的主線程,以及在建立連接時產生的通信線程。這兩個線程將使用觀察者設計模式的一些變體進行通信,這意味着「回調」或實際的觀察者。這允許主線程繼續而不凍結GUI。確保在通信線程調用時,以某種方式將調用分派給主線程。

在服務器端,通常會有一些相同模式的變體。將有一個主線程監聽連接,然後爲每個創建的連接生成一個線程(或進程)。通信線程只要會話就會生效。這使通信線程可以阻止呼叫,而不會使主線程無法接受新的連接。

這是相同的想法,真的。

有很多變種,尤其是服務器端。重點通常是爲了節約資源並避免重新開展工作,因此您想限制允許的線程數量,並且您可能希望重新使用它們(「線程池」)。至於如何在C++中做到這一點,這不是一個容易回答的問題。像C#和Java這樣的現代語言有明確的做法,但C++在這方面是不可知的。沒有「C++」的答案,但會有「Windows上的C++」答案。不是Windows的傢伙,我無法真正幫助你。

+0

UI或服務器端的線程? – deepdive

+0

@DivyangPatel客戶端。如果你想引入異步服務器調用,你需要一個完全不同的架構和API。 – Fildor