簡體   English   中英

重構多線程風格的單線程GUI代碼

[英]Refactoring single threaded GUI code for multithreaded scenarious

通常情況下,有一個MFC / Win32 / WTL / wxWidgets / Qt應用程序可以做一些有用的事情。 它被設計為單線程,並且有一些邏輯可以處理處理塊中的錯誤/問題。

因此,在某個類的深處,可以觸發一個對話框,詢問用戶“你確定要完成操作嗎?”/“文檔布局錯誤”或類似的東西。

問題是對話框是從計算密集/嚴格的代碼中觸發的。 像FFT /圖像銳化/文件系統去碎片功能,或類似的東西。 如果不是GUI,可以輕松地在工作線程中啟動。 並且會更好地適應那里,因為它會避免對用戶來說非常煩人的GUI停頓。

但是,GUI無法在工作線程中工作,並且依賴注入幾乎不可能,因為它會降低幾層計算代碼。 從類接口的角度來看,非常不干凈,就像someclass instance(data_in, data_out, param1, param2, GUI_class_ref) : m_GUI(GUI_class_ref), ... 3級或更深層次。

是否存在這樣的場景的模式/清單,如果代碼在多個線程中分割,可用於將GUI提示返回主線程並將結果返回到計算代碼的核心?

您可以創建同步上下文。 它是由主線程執行的命令隊列。 工作線程將命令添加到此隊列(必須鎖定以進行單線程訪問)並等待。 主線程定期處理此隊列,執行命令(例如,“取消操作”對話框)並通知工作線程結果。
在C#中,這是通過委托和參數來完成的。 在C ++中,您可以使用枚舉編碼的消息在交換機中處理(如Windows程序中的消息)。或者使用指向成員函數的指針創建一些內容+對象指針以從+參數調用它們來調用。

你是一個經典的舊代碼重構十字路口。 正確的隔離和依賴注入是不可行的,因此您可以全局訪問GUI上下文。 那就是創造一個單身人士。 它不一定需要直接成為GUI上下文,因此至少可以實現一些隔離。 它可以是某種具有GUI上下文的管理器,只接受來自計算代碼的特定的一個目的調用。 您可以使GUI線程類成為此管理器的朋友,並使GUI回調(在關閉對話框時)為private。

我可以提供更具體的想法,因為我經歷了完全相同的挑戰(現有重型應用程序的線程化)。 但我很困惑你是否只想讓GUI線程自由運行,或者也想要背景計算。 您給出的示例對話框提示令人困惑,因為它建議需要回答的決定是否繼續(這意味着計算處於保持狀態)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM