2013-10-14 66 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