2012-06-11 38 views
1

我的項目中的應用程序一直使用同步調用通過qtdbus進行通信。不過,我現在需要將這些調用中的一部分轉換爲異步。 爲此,我選擇使用qtdbus中提供的這個API QDBusAbstractInterface :: callWithCallback 但問題是,當前實現的這些qtdbus同步調用分散在代碼中的很多地方,並且遵循這些同步調用的代碼片段假定當前面的呼叫被成功地服務並獲得答覆時,控制只能到達他們。 當呼叫變爲異步時,情況將不再是這種情況。此外,呼叫是在不同的環境中進行的,因此我需要在每次qtdbus呼叫之前保持系統的狀態,以便在接到答覆時我知道該怎麼做。 真的有機會以某種方式將調用轉換爲異步,而不會大幅破壞當前代碼的結構? 我能想到的一種方法是使用FSM模式。 任何提示或設計建議將不勝感激。 謝謝!將同步qtdbus調用轉換爲異步所需的設計建議

回答

0

我的理解方式是您需要調用相同的方法,然後根據調用時的狀態對返回值進行不同處理。如

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()。這樣它在技術上仍然是一個異步調用,但它同步。