我的項目中的應用程序一直使用同步調用通過qtdbus進行通信。不過,我現在需要將這些調用中的一部分轉換爲異步。 爲此,我選擇使用qtdbus中提供的這個API QDBusAbstractInterface :: callWithCallback 但問題是,當前實現的這些qtdbus同步調用分散在代碼中的很多地方,並且遵循這些同步調用的代碼片段假定當前面的呼叫被成功地服務並獲得答覆時,控制只能到達他們。 當呼叫變爲異步時,情況將不再是這種情況。此外,呼叫是在不同的環境中進行的,因此我需要在每次qtdbus呼叫之前保持系統的狀態,以便在接到答覆時我知道該怎麼做。 真的有機會以某種方式將調用轉換爲異步,而不會大幅破壞當前代碼的結構? 我能想到的一種方法是使用FSM模式。 任何提示或設計建議將不勝感激。 謝謝!將同步qtdbus調用轉換爲異步所需的設計建議
1
A
回答
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()
。這樣它在技術上仍然是一個異步調用,但它同步。
相關問題
- 1. 將異步調用轉換爲同步?
- 2. 如何將異步設計模式轉換爲同步模式?
- 3. 如何將異步調用轉換爲JavaScript中的同步?
- 4. 將事件轉換爲異步調用
- 5. 將異步/回調方法轉換爲阻塞/同步方法
- 6. 同步信息的設計建議
- 7. 設計使用同時支持同步和異步調用
- 8. 在UI線程中轉換異步調用到同步調用
- 9. 將一系列同步AJAX請求轉換爲異步請求
- 10. 將HttpWebRequest從同步轉換爲異步代碼
- 11. 將異步函數轉換爲同步函數
- 12. 將阻塞同步代碼轉換爲異步
- 13. 如何將同步ajax轉換爲異步?
- 14. 將同步方法轉換爲與C#異步#
- 15. 使異步調用同步
- 16. 同步異步API調用
- 17. 使異步調用同步
- 18. 索引服務設計 - 同步/異步
- 19. Javascript轉換異步到同步
- 20. Javascript:同步到異步轉換庫
- 21. 異步Web調用 - 所需的配置
- 22. 需要幫助將rxjs forkjoin調用轉換爲異步調用(在ngrx @Effect中)
- 23. 用於網絡協議設計的異步單線程與同步多線程?
- 24. 將同步代碼(使用BinaryReader)轉換爲使用NetworkStream的異步/等待
- 25. 將異步Web服務調用爲Java中的同步
- 26. 調用webservice的異步UI設計
- 27. Firefox插件:將異步轉換爲異步
- 28. 設計建議所需
- 29. 切換同步和異步行爲
- 30. 同步和異步回調