C++每日訓練 Day 17:構建響應式加載動畫與異步數據處理

📘 本篇目標是:在 GUI 信號機制基礎上,構建一個完整的“點擊按鈕 → 顯示加載動畫 → 異步加載數據 → 顯示結果”的響應式界面流程。通過協程掛起/恢復機制,實現清晰的異步邏輯,避免回調地獄。


🔁 回顧 Day 16:GUI 響應式信號機制

在 Day 16 中,我們學習了如何使用協程和信號機制處理 GUI 事件。主要內容包括:

  • 按鈕點擊事件的處理:通過協程掛起,等待按鈕點擊事件的發生,然后恢復協程執行相應的邏輯。
  • 信號機制的實現:使用 SignalHub 類管理不同的事件類型,實現事件的訂閱和觸發。
  • 協程與 Dispatcher 的結合:確保協程的恢復在正確的線程中執行,避免線程安全問題。

這些基礎為我們今天的內容打下了堅實的基礎。


在這里插入圖片描述

? 一、模擬加載動畫組件

我們首先創建一個簡單的加載動畫組件,用于在數據加載期間顯示加載狀態。

struct LoadingSpinner {void show() {std::cout << "🔄 顯示加載動畫...\n";}void hide() {std::cout << "? 隱藏加載動畫\n";}
};

? 二、構建異步數據加載器

接下來,創建一個模擬異步加載數據的函數,使用協程實現。

Task<std::string> loadDataAsync() {co_await std::suspend_always{}; // 模擬異步等待std::this_thread::sleep_for(std::chrono::seconds(2)); // 模擬加載時間co_return "數據加載完成";
}

? 三、構建按鈕點擊事件處理協程

我們創建一個協程函數,處理按鈕點擊事件,顯示加載動畫,加載數據,并在加載完成后更新界面。

Task<void> onButtonClick(LoadingSpinner& spinner) {spinner.show(); // 顯示加載動畫std::string data = co_await loadDataAsync(); // 異步加載數據spinner.hide(); // 隱藏加載動畫std::cout << "📦 加載結果: " << data << "\n";co_return;
}

? 四、主函數模擬用戶點擊按鈕

在主函數中,模擬用戶點擊按鈕,觸發上述協程。

int main() {LoadingSpinner spinner;std::cout << "🖱? 用戶點擊按鈕\n";auto task = onButtonClick(spinner); // 啟動協程處理按鈕點擊事件// 模擬事件循環while (!task.done()) {task.resume(); // 恢復協程執行}return 0;
}

輸出:

🖱? 用戶點擊按鈕
🔄 顯示加載動畫...
? 隱藏加載動畫
📦 加載結果: 數據加載完成

? 總結

通過以上步驟,我們實現了一個完整的響應式界面流程,使用協程清晰地表達了異步邏輯,避免了傳統回調方式帶來的復雜性。


🧠 鞏固練習題

Q1:如何確保協程 resume 在主線程執行?
A:使用主線程的 Dispatcher,在協程掛起時記錄 Dispatcher,resume 時通過 Dispatcher 調度回主線程。

Q2:如何處理多個按鈕點擊事件?
A:為每個按鈕創建獨立的協程處理函數,分別處理各自的點擊事件。

Q3:如何處理加載失敗的情況?
A:在 loadDataAsync 中添加異常處理邏輯,在協程中使用 try-catch 捕獲異常,進行相應的錯誤處理。


🔭 下一步 Day 18:構建響應式表單與數據驗證

  • 創建響應式表單組件
  • 使用協程處理表單輸入與驗證
  • 實現異步提交與結果反饋

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76253.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch深度學習框架60天進階學習計劃 - 第45天:神經架構搜索(二)

PyTorch深度學習框架60天進階學習計劃 - 第45天&#xff1a;神經架構搜索&#xff08;二&#xff09; 第二部分&#xff1a;權重共享策略的計算效率優化 8. 權重共享的理論基礎 權重共享策略的理論基礎來自于多任務學習(Multi-Task Learning, MTL)和遷移學習(Transfer Learn…

深入理解分布式緩存 以及Redis 實現緩存更新通知方案

一、分布式緩存簡介 1. 什么是分布式緩存 分布式緩存&#xff1a;指將應用系統和緩存組件進行分離的緩存機制&#xff0c;這樣多個應用系統就可以共享一套緩存數據了&#xff0c;它的特點是共享緩存服務和可集群部署&#xff0c;為緩存系統提供了高可用的運行環境&#xff0c…

記錄學習的第二十九天

還是力扣每日一題。 本來想著像昨天一樣兩個循環搞定的&#xff0c;就下面&#x1f447;&#x1f3fb; 不過&#xff0c;結果肯定是超時啦&#xff0c;中等題是吧。 正確答案是上面的。 之后就做了ls題單第一部分&#xff0c;首先是定長滑窗問題 這種題都是有套路的&#xff0…

Win11關閉防火墻方法

網上講的win11的方法都試過了&#xff0c;但是在實際使用過程中還是會顯示有威脅殺掉原本要使用的程序&#xff0c;下面我介紹的這個方法親測有效&#xff0c;必須百分百關掉防火墻 搜索安全中心打開Windows安全中心 打開病毒和威脅防護 點擊管理設置 將設置中所有顯示開的都…

幾個常用的快速處理服務器命令和故障排查

1. 查看剩余的內存 free -m top //當然了還有top可以實時觀測 顯示剩余內存,以M為單位. 2. 查看剩余的空間 df -h 顯示指定磁盤文件的可用空間。如果沒有文件名被指定&#xff0c;則所有當前被掛載的文件系統的可用空間將被顯示 3.找出大文件的常用方法 du --max-depth1 -h –輸…

Spring MVC 全棧指南:RESTful 架構、核心注解與 JSON 實戰解析

目錄 RESTful API 設計規范Spring MVC 核心注解解析靜態資源處理策略JSON 數據交互全解高頻問題與最佳實踐 一、RESTful API 設計規范 1.1 核心原則 原則說明示例 URI資源為中心URI 使用名詞&#xff08;復數形式&#xff09;/users ?? /getUser ?HTTP 方法語義化GET&…

探索 JavaScript 中的 Promise 高級用法與實戰

在現代 Web 開發中&#xff0c;異步編程已成為不可或缺的一部分。JavaScript 作為 Web 開發的核心語言&#xff0c;提供了多種處理異步操作的方式&#xff0c;其中 Promise 對象因其簡潔、強大的特性而備受青睞。本文將深入探討 Promise 的高級用法&#xff0c;并結合實際案例&…

《軟件設計師》復習筆記(14.1)——面向對象基本概念、分析設計測試

目錄 一、面向對象基本概念 對象&#xff08;Object&#xff09; 類&#xff08;Class&#xff09; 抽象&#xff08;Abstraction&#xff09; 封裝&#xff08;Encapsulation&#xff09; 繼承&#xff08;Inheritance&#xff09; 多態&#xff08;Polymorphism&#…

ubuntu22.04 安裝有度即時通

1.官網下載deb的安裝包 官網地址&#xff1a;有度客戶端下載-有度 注意&#xff1a;這個網站的下載是有時間限制的&#xff0c;有時候無法下載 需要對應系統版本&#xff0c;否則無法使用 我之前使用了dpkg安裝了一個舊版本&#xff0c;卸載使用以下命名行&#xff1a; 使用…

ValueError: model.embed_tokens.weight doesn‘t have any device set

ValueError: model.embed_tokens.weight doesn’t have any device set model.embed_tokens.weight 通常在深度學習框架(如 PyTorch)中使用,一般是在處理自然語言處理(NLP)任務時,用于指代模型中詞嵌入層(Embedding layer)的權重參數。下面詳細解釋: 詞嵌入層的作用 …

如何提高單元測試的覆蓋率

一、定位未覆蓋的代碼 ?利用 IDEA 的覆蓋率工具?&#xff1a; 右鍵測試類 → ?Run with Coverage&#xff0c;或使用 AltShiftF10&#xff08;Windows&#xff09;打開運行菜單選擇覆蓋率。?查看高亮標記?&#xff1a; ?綠色?&#xff1a;已覆蓋代碼行。?紅色?&#x…

聚合直播-Simple Live-v1.7.7-全網直播平臺能在一個軟件上看完

聚合直播-Simple Live 鏈接&#xff1a;https://pan.xunlei.com/s/VOO7u3o4FNL_XA9VJ6l7KBNfA1?pwdyrau# 聚合直播-Simple Live-v1.7.7-全網直播平臺能在一個軟件上看完

三大等待和三大切換

三大等待 1、三大等待&#xff1a;等待的方式有三種&#xff1a;強制等待&#xff0c;隱性等待&#xff0c;顯性等待。 1、強制等待&#xff1a;time.sleep(2)&#xff0c;秒 優點&#xff1a;使用簡單缺點&#xff1a;等待時間把握不準&#xff0c;容易造成時間浪費或者等待時…

使用Lombok @Builder 收參報錯提示沒有無參構造方法的原因與解決辦法

使用Lombok Builder 收參報錯提示沒有無參構造方法的原因與解決辦法 類上加了Builder之后接口接收前端傳來的參數報錯&#xff1a;(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 1.解決辦法…

SAP 查找JOB進程ID

如何查找后臺JOB的進程ID SM37勾選對于JOB

通過C# 將Excel表格轉換為圖片(JPG/ PNG)

Excel 表格可能會因為不同設備、不同軟件版本或字體缺失等問題&#xff0c;導致格式錯亂或數據顯示異常。轉換為圖片后&#xff0c;能確保數據的排版、格式和外觀始終保持一致&#xff0c;無論在何種設備或平臺上查看&#xff0c;都能呈現出固定的樣式&#xff0c;避免了因環境…

Langchain構建RAG對話應用

本文&#xff1a;關注 檢索器與上下文的子鏈、父鏈&#xff1b;即檢索器也需要上下文內容。 RAG是一種增強LLM知識的方法&#xff0c;通過引入額外的數據來實現。 實現思路&#xff1a;加載—》分割—》存儲—》檢索—》生成。 初始化 import os import bs4 from langchain.c…

關于模擬噪聲分析的11個誤區

目錄 1. 降低電路中的電阻值總是能改善噪聲性能 2. 所有噪聲源的噪聲頻譜密度可以相加&#xff0c;帶寬可以在最后計算時加以考慮 3. 手工計算時必須包括每一個噪聲源 4. 應挑選噪聲為ADC 1/10的ADC驅動器 5. 直流耦合電路中必須始終考慮1/f噪聲 6. 因為1/f噪聲隨著頻率降…

vue,uniapp解決h5跨域問題

如果有這樣的跨域問題&#xff0c;解決辦法&#xff1a; ? 第一步&#xff1a;在項目根目錄下創建 vue.config.js 和 package.json 同級目錄。 // vue.config.js module.exports {devServer: {proxy: {/api: {target: https://app.yycjkb.cn, // 你的后端接口地址changeOrig…

SQL通用語法和注釋,SQL語句分類(DDL,DML,DQL,DCL)及案例

目錄 SQL通用語法和注釋 SQL語句分類&#xff08;DDL&#xff0c;DML&#xff0c;DQL&#xff0c;DCL&#xff0c;TPL&#xff0c;CCL&#xff09; DDL&#xff08;數據定義語言&#xff09; 數據庫操作 查詢&#xff08;SHOW、SELECT&#xff09; 創建&#xff08;CREAT…