非同步更新介面方法

2022-10-11 03:03:09 字數 818 閱讀 5138

**中頻繁出現下面描述的模式,

某些操作呼叫服務端介面獲取資料、執行複雜的資料解析,這些操作不能阻塞ui執行緒,必須非同步執行,但通常這些操作執行完後需要對介面元素進行更新。

就是這麼個模式在**中頻繁出現。

之前**解決此問題的方式是使用thread,一般流程是下面這樣(工作任務一般在模型中有封裝,這些操作是阻塞的),

1.  首先我們必須把這些介面封裝成thread要求的介面,通常使用內部類(之前我們用的是vs05版本,沒有lambda)

2.  呼叫boost::thread

3.  執行完後postmessage到某個窗體

4. 修改該窗體**,加上訊息捕獲和訊息處理方法

5. 等(取決想要什麼額外操作和程式設計師的寫法)

使用過類似方法的都知道有多痛苦,想寫的心都沒了,有時因此還會偷懶,比如在非同步中更新介面元素。

通常上面說的每一步都是很短小且用一次的**,但使用上面的方式必須把小短的**分散到不同的原始檔中,增加了物件間的引用互動,最主要的是麻煩,每次需要執行該模式時,執行上面的每一步都是痛苦的。

想要的其實很簡單:非同步執行指定的動作,等執行完後記得更新介面元素。

既然是頻繁出現的模式,那就把該模式封裝起來,介面中只需填寫

1. 需要執行什麼動作

2. 如何更新介面元素

參照c#中的then,我們最終要的大概是如下寫法,

aync([=]()->dword_ptr ).then([=](dword_ptr result) {

updatecrashresult(unsigned int)begin->first.fileid(), (int)result);

MFC利用執行緒更新介面

error c2665 afxbeginthread 2 個過載中沒有乙個可以轉換所有引數型別 1.執行緒函式 必須是 靜態類成員函式 或者 全域性函式 cwinthread pthread afxbeginthread connectfunc,lpvoid this static uint con...

MFC 利用執行緒更新介面

非常感謝 baiyin 的文章 mfc在其他執行緒中重新整理主對話方塊中edit等控制項資料 正在進行的專案中,要在新開啟的執行緒中處理資料,並把資料的處理結果在介面控制項中更新,所以需要使資料處理執行緒傳送訊息給介面,下面是乙個小例子 1 在mfc的對話方塊中,新增乙個文字編輯框控制項 edit ...

工作執行緒中如何更新介面

工作執行緒在更新程式介面時,很多時候會出現莫名奇妙的錯誤。我想了很多方法都不行,今天從委託中得到了靈感。那就是觸發介面的事件。主要的流程是 自定義事件訊息 如 define wm showflashadv wm user 103 自定義事件函式 lresult cadvisorywidgetdlg ...