到目前为止,我的项目中的应用程序都是使用同步调用通过qtdbus进行通信的。但是,我现在需要将其中一些调用转换为异步调用。为此,我选择使用qtdbus QDBusAbstractInterface::callWithCallback中提供的API,但问题是,当前的实现将这些qtdbus同步调用分散在代码中的许多地方,并且这些同步调用后面的代码片段假定只有当前一个调用成功服务并获得回复时,控件才会到达它们。当呼叫更改为异步时,将不再是这种情况。此外,这些调用是在不同的上下文中进行的,因此我需要在每次qtdbus调用之前维护系统的状态,以便我在收到回复时知道该做什么。有没有可能真的以某种方式将调用转换为异步,而不会在很大程度上破坏当前代码的结构?我能想到的一种方法是使用FSM模式。任何提示或设计建议将非常感谢。谢谢!
发布于 2012-06-14 02:00:26
我的理解是,您需要调用相同的方法,然后根据调用时的状态以不同的方式处理返回值。比如
void function()
{
//do stuff
value = SynchronousCall();
if (state == 1)
{
doSomething(value);
}
else
{
doSomethingElse(value);
}
}我建议为每个状态添加单独的方法,而不是完整地实现有限状态机模式,因为有限状态机模式可能会使它添加的类数量变得混乱
void function()
{
//do stuff
if (state == 1)
{
callback = *doSomething(ValueType);
}
else
{
callback = *doSomethingElse(ValueType);
}
callWithCallback(method,args, receiver,callback,error);
}然后,在每个方法中,您可以假定该状态并相应地处理返回值。
另一种稍微(非常)老套的方法是在所有异步调用之后使用一个旋转等待,并在等待返回值的同时在循环中使用QThread:: yield()。这样,从技术上讲,它仍然是异步调用,但它的行为是同步的。
https://stackoverflow.com/questions/10974683
复制相似问题