【BES2500x系列 -- RTX5操作系統】深入探索CMSIS-RTOS RTX -- 同步與通信篇 -- 消息隊列和郵箱處理 --(四)

請添加圖片描述

  • 💌 所屬專欄:【BES2500x系列】

  • 😀 作??者:我是夜闌的狗🐶

  • 🚀 個人簡介:一個正在努力學技術的CV工程師,專注基礎和實戰分享 ,歡迎咨詢!

  • 💖 歡迎大家:這里是CSDN,我總結知識的地方,喜歡的話請三連,有問題請私信 😘 😘 😘

您的點贊、關注、收藏、評論,是對我最大的激勵和支持!!!🤩 🤩 🤩

請添加圖片描述

文章目錄

  • 前言
  • 1 介紹
  • 2 功能特性
  • 3 同步與通信
      • 3.1 通信
  • 4 同步與通信
      • 4.1 消息隊列
        • 4.1.1 定義
        • 4.1.2 創建
        • 4.1.3發送消息
      • 4.2 郵箱處理
        • 4.2.1 定義
        • 4.2.2 創建
        • 4.2.3 發送/釋放郵件
        • 4.2.4 獲取郵件
  • 總結


前言

??大家好,又見面了,我是夜闌的狗🐶,本文是專欄【BES2500x系列】專欄的第4篇文章;
??今天開始學習BES2500x系列的一天💖💖💖,開啟新的征程,記錄最美好的時刻🎉,每天進步一點點。
??專欄地址:【BES2500x系列】, 此專欄是我是夜闌的狗對BES2500x系列開發過程的總結,希望能夠加深自己的印象,以及幫助到其他的小伙伴😉😉。
??如果文章有什么需要改進的地方還請大佬不吝賜教👏👏。


<<【系列文章索引】>>

1 介紹

??在嵌入式系統中,同步和通信是確保系統內各個組件協調工作的兩個核心概念。它們對于實現高效、可靠的嵌入式應用至關重要。前面已經講過同步概念了,接下來對通信概念進行簡要說明。話不多說,那接下來就學習 RTX 系統中通信機制都有哪些吧,讓我們原文再續,書接上回吧。😉

在這里插入圖片描述

2 功能特性

??在實時操作系統(RTOS)中,任務管理和同步通信是關鍵組件,它們確保系統的高效和有序執行。本文將探討這些概念,特別是線程管理、信號量、互斥鎖、消息隊列和郵箱處理。

  • 任務管理:RTX提供任務創建、調度和優先級管理,確保任務按照優先級及時執行。
  • 同步與通信:包括信號量、互斥鎖、消息隊列和郵箱,促進任務間的同步和數據交換。
  • 內存管理:內存池和動態內存分配,有效管理有限的系統資源。
  • 定時器服務:虛擬和硬件定時器,支持周期性任務和一次性事件觸發。
  • 中斷處理:保證中斷服務的快速響應,同時保持任務的上下文安全。
  • 線程安全:通過內核級保護機制,防止多線程環境下的數據競爭和死鎖。

3 同步與通信

3.1 通信

??通信是指嵌入式系統中不同組件或任務之間交換信息的過程。有效的通信機制對于分布式系統和多處理器系統尤為重要。嵌入式系統中常用的通信方式包括:

序號方法說明
1消息隊列(Message Queues)任務間通過發送和接收帶有數據的消息來通信,支持異步通信。
2管道(Pipes)一種半雙工的數據傳輸方式,常用于進程間的通信。
3共享內存(Shared Memory)多個任務可以直接讀寫同一塊內存區域,效率高但需要同步機制來避免沖突。
4總線(Buses)I2CSPIUART等硬件接口,用于設備間的數據傳輸。
5遠程過程調用(RPC)允許程序調用網絡中另一臺計算機上的子程序,模擬本地調用。
6中斷(Interrupts)硬件觸發的事件,用于通知 CPU 處理緊急或外部事件,是一種快速的通信方式。

??同步和通信機制的選擇取決于嵌入式系統的具體需求,包括實時性、資源限制、復雜度以及系統的可靠性要求。合理設計同步和通信策略,是保證嵌入式系統高效穩定運行的關鍵。

4 同步與通信

4.1 消息隊列

??消息隊列允許線程間安全地傳遞固定大小的消息,提供了異步通信的方式。

4.1.1 定義

??消息隊列允許線程安全地發送和接收固定大小的數據塊。隊列維護發送和接收的順序。一般在文件開頭會看到這樣的定義:osMessageQDef

  • 代碼
// 定義一個名為app_test1_queue的消息隊列,可存儲128個uint32_t類型的元素。
osMessageQDef(app_test1_queue, 128, uint32_t);// 聲明一個osMessageQId類型的變量app_test1_queue_id,用于保存消息隊列的句柄。
// 在程序運行時,需要通過調用相關API初始化并獲取有效的句柄值。
osMessageQId app_test1_queue_id = NULL;

??這段代碼首先使用 osMessageQDef 宏定義了一個名為 app_test1_queue 的消息隊列,它可以存儲128個32位無符號整數。然后聲明了一個變量 app_test1_queue_id ,用于存儲消息隊列的標識符(句柄),初始值設為 NULL 。在實際應用中,需要通過操作系統提供的API來初始化這個消息隊列,并將返回的句柄賦值給app_test1_queue_id

/*** 定義一個消息隊列。* * 這個宏用于靜態定義一個消息隊列,它會創建一個靜態隊列控制塊和一個用于存儲消息的數據緩沖區。* * @param name 消息隊列的名稱。* @param queue_sz 隊列中能容納的消息數量。* @param type 消息隊列中每條消息的數據類型。*/
#define osMessageQDef(name, queue_sz, type) \
static StaticQueue_t os_mq_cb_##name; \
static uint32_t os_mq_data_##name[(queue_sz) * sizeof(type)]; \
const osMessageQDef_t os_messageQ_def_##name = \
{ (queue_sz), \{ NULL, 0U, (&os_mq_cb_##name), sizeof(StaticQueue_t), \(&os_mq_data_##name), sizeof(os_mq_data_##name) } }

??此宏定義了三個靜態變量:一個靜態隊列控制塊,一個消息數據數組,和一個用于OS的消息隊列定義結構體。這個結構體包含了隊列的大小、指針到靜態隊列控制塊和消息數據數組的地址,以及這些數組的大小。這使得在系統運行時能夠直接使用這個消息隊列而無需動態分配內存。

  • 參數/函數講解
序號參數/函數說明
1osMessageQId聲明變量,用于存儲消息隊列的標識符(句柄),初始值設為NULL。
2osMessageQDef定義了靜態變量:靜態隊列控制塊,消息數據數組和用于OS的消息隊列定義結構體
4.1.2 創建

??通過 osMessageQueueCreate() 函數創建消息隊列,指定隊列容量和消息大小。

  • 代碼
/*** 初始化app_test1_queue消息隊列。** 這個函數負責創建名為app_test1_queue的消息隊列,并將成功創建的句柄保存到全局變量app_test1_queue_id。* 如果消息隊列創建失敗,它會記錄錯誤信息并返回-1。** @return*   - 0: 消息隊列創建成功。*   - -1: 創建消息隊列失敗。*/
static int32_t app_test1_queue_init(void)
{// 使用osMessageCreate函數創建消息隊列,并將句柄保存到全局變量app_test1_queue_id = osMessageCreate(osMessageQ(app_test1_queue), NULL);// 檢查創建是否成功,如果失敗則打印錯誤信息并返回-1if (app_test1_queue_id == NULL) {TRACE(0, "Failed to Create app_test_thread1_queue");return -1;}// 創建成功,返回0return 0;
}

??這段代碼定義了一個名為 app_test1_queue_init 的靜態函數,用于初始化之前定義的消息隊列app_test1_queue 。它通過調用o sMessageCreate 函數創建消息隊列,并檢查返回的句柄是否有效。如果創建失敗,它會記錄錯誤信息并返回 -1 ;否則,返回 0 表示成功。

  • 參數/函數講解
序號參數/函數說明
1osMessageCreate創建消息隊列
4.1.3發送消息

??使用 osMessageQueueSend()osMessageQueuePut() 函數向隊列發送消息。

  • 代碼
/*** 嘗試向app_test1_queue中發送消息。** 此函數檢查消息隊列是否有足夠的空間接收至少6條消息。如果隊列有足夠空間,* 它將向隊列中放入一個值為0xFF的消息,不設置優先級。** 注意:這個函數沒有處理消息隊列滿的情況,因此在隊列滿時不會阻塞。*/
void app_test1_queue_put(void)
{// 檢查消息隊列是否有超過5個空閑槽位if (osMessageGetSpace(app_test1_queue_id) > 5) {// 向消息隊列app_test1_queue_id中插入一個值為0xFF的消息,優先級設為0osMessagePut(app_test1_queue_id, 0xFF, 0);}
}

??這個函數 app_test1_queue_put 嘗試將一個值為 0xFF 的消息放入名為 app_test1_queue 的消息隊列中。首先,它檢查隊列是否有足夠的空間容納至少6個新消息。如果滿足條件,就調用 osMessagePut 將消息放入隊列,否則不做任何操作。注意,這個函數沒有處理隊列已滿的情況,所以如果隊列已滿,消息將不會被發送,也不會阻塞調用線程。

  • 參數/函數講解
序號參數/函數說明
1osMessageGetSpace檢查消息隊列的空閑槽位
2osMessagePut將消息放入隊列

4.2 郵箱處理

??郵箱是用于線程間交換結構化數據的對象池。每個郵箱包含一組預先分配的內存塊,線程可以申請、發送和接收這些內存塊。

4.2.1 定義

??一般在文件開頭會看到這樣的定義:osMailQDef

  • 代碼
osMailQDef (app_test1_mailbox, APP_TEST1_MAX_MAILBOX, APP_TEST1_MAIL); 
/*** app_test1_mailbox: 郵箱隊列定義** 使用osMailQDef宏定義一個名為'app_test1_mailbox'的郵箱隊列,最大郵件數為APP_TEST1_MAX_MAILBOX,* 郵件類型為APP_TEST1_MAIL。*/// 郵箱隊列ID,用于后續操作
static osMailQId app_test1_mailbox_id = NULL;/*** app_test1_mail_alloc - 分配并初始化一個APP_TEST1_MAIL類型的郵件** @param mail 指向郵件指針的指針,用于存放新分配的郵件地址。** 返回值: 成功分配時返回0,失敗則返回非0值。** 此函數為內部使用,負責從'app_test1_mailbox'郵箱隊列中分配一個新的郵件,并將其地址存儲在* 輸入參數'mail'指向的變量中。具體實現省略。*/
static int app_test1_mail_alloc(APP_TEST1_MAIL** mail)
{// ...
}

??osMailQDef 定義了一個名為 app_test1_mailbox 的郵箱隊列,用于存儲 APP_TEST1_MAIL 類型的數據。APP_TEST1_MAX_MAILBOX 定義了郵箱隊列可容納的最大郵件數量。這個郵箱隊列可以用于多線程或任務之間的數據通信,確保數據安全地傳遞。

/*** 定義一個郵箱隊列。* * 該宏用于靜態定義一個郵箱隊列以及相關的OS郵箱隊列結構體。它為指定的郵箱隊列分配內存,* 并初始化OS郵箱隊列結構體。* * @param name 郵箱隊列的名稱。* @param queue_sz 郵箱隊列中郵件的最大數量。* @param type 郵件中元素的類型。*/
#define osMailQDef(name, queue_sz, type) \
static uint32_t os_mailQ_m_##name[3+((sizeof(type)+3)/4)*(queue_sz)]; \
osMailQDef_t os_mailQ_def_##name = \
{ {(queue_sz), sizeof(type), (os_mailQ_m_##name)}, NULL, {NULL} }

??在上述宏定義中:

??(1) 第一部分定義了一個靜態數組 os_mailQ_m_##name,用于存儲郵箱隊列中的郵件。數組大小根據郵件類型 type 的大小和隊列大小 queue_sz 動態計算得出。
??(2) 第二部分定義了一個 osMailQDef_t 類型的結構體 os_mailQ_def_##name,其中包含了郵箱隊列的配置信息,如隊列大小、郵件類型大小以及郵件存儲區的指針。

  • 參數/函數講解
序號參數/函數說明
1osMailQDef定義了的郵箱隊列,用于存儲 APP_TEST1_MAIL 類型的數據
2app_test1_mailbox_id是一個全局變量,用于存儲郵箱隊列的標識符,方便后續操作
3app_test1_mail_alloc用于從 app_test1_mailbox 中分配一個新的郵件,并將分配的郵件地址通過參數 mail 返回
4os_mailQ_m_##name用于存儲郵箱隊列中的郵件
5osMailQDef_t定義結構體,其中包含了郵箱隊列的配置信息
4.2.2 創建

??通過 osMailQCreate() 函數創建郵箱,指定郵箱的大小和數據類型。

  • 代碼
/*** app_test1_mailbox_init - 初始化app_test1_mailbox郵箱隊列** @return: 成功初始化時返回0,失敗則返回-1。** 此函數用于初始化之前定義的'app_test1_mailbox'郵箱隊列。它調用osMailCreate函數創建郵箱隊列,* 并將返回的郵箱ID存儲在全局變量'app_test1_mailbox_id'中。如果創建失敗,函數會輸出錯誤信息* "Failed to Create app_test_thread1_mailbox",并返回-1表示初始化失敗。*/
static int32_t app_test1_mailbox_init(void)
{app_test1_mailbox_id = osMailCreate(osMailQ(app_test1_mailbox), NULL);if (app_test1_mailbox_id == NULL) {TRACE(0, "Failed to Create app_test_thread1_mailbox");return -1;}return 0;
}

??這個函數 app_test1_mailbox_init 負責初始化之前通過 osMailQDef 宏定義的 app_test1_mailbox 郵箱隊列。如果初始化成功,它將返回0;如果失敗(即無法創建郵箱隊列),它會打印錯誤信息并返回-1。

  • 參數/函數講解
序號參數/函數說明
1osMailCreate創建郵箱隊列
4.2.3 發送/釋放郵件

??使用 osMailQAlloc() 分配郵箱中的空間,然后用 osMailPut() 發送郵件。

  • 代碼
/*** app_test1_mail_send - 發送一個APP_TEST1_MAIL類型的郵件到app_test1_mailbox** @param mail 需要發送的郵件對象指針。** 返回值: 成功發送時返回0,失敗則返回非0值。** 此函數用于將一個APP_TEST1_MAIL類型的郵件對象發送到'app_test1_mailbox'郵箱隊列中。* 具體實現省略,可能涉及到郵箱隊列的同步原語以保證線程安全。*/
static int app_test1_mail_send(APP_TEST1_MAIL* mail)
{// ...
}/*** app_test1_mail_free - 釋放app_test1_mailbox中的一個郵件對象** @param mail_p 已分配的郵件對象指針。** 返回值: 成功釋放時返回0,失敗則返回非0值。** 此函數用于釋放'app_test1_mailbox'郵箱隊列中已分配的一個郵件對象,以便于后續再使用。* 具體實現省略,可能涉及郵箱隊列的同步原語以保證線程安全。*/
static int app_test1_mail_free(APP_TEST1_MAIL* mail_p)
{// ...
}
  • 參數/函數講解
序號參數/函數說明
1app_test1_mail_send用于向 app_test1_mailbox 郵箱隊列中發送郵件
2app_test1_mail_free用于向 app_test1_mailbox 郵箱隊列中釋放已分配的郵件
4.2.4 獲取郵件

??線程通過 osMailGet() 函數獲取郵件,可以選擇等待或立即返回。

  • 代碼
/*** @brief          獲取應用測試1的郵件對象* * @description    該函數從內部數據結構中獲取一個`APP_TEST1_MAIL`類型的郵件對象。*                 如果郵件可用,它將分配內存并填充郵件內容,然后將其指針返回。* * @param[out]     mail_p     指向接收`APP_TEST1_MAIL`結構體指針的指針。*                            如果成功獲取郵件,此參數將被設置為有效郵件對象的指針。* * @return         成功獲取郵件對象返回0,否則返回非0錯誤代碼:*                 -1:郵件隊列為空*                 -2:內存分配失敗*                 其他值:可能表示其他錯誤情況** @note           實現應考慮線程安全,可能需要加鎖來保護數據結構。*                 如果隊列為空,可以選擇阻塞等待,直到有新郵件到達。*/
static int app_test1_mail_get(APP_TEST1_MAIL** mail_p)
{// 實現獲取郵件對象的邏輯,包括檢查隊列、分配內存、填充郵件內容等// ...if (/* 郵件隊列為空或分配內存失敗等錯誤條件 */) {return -1; // 或者 -2}return 0; // 成功獲取郵件
}

??app_test1_mail_get 函數用于從 app_test1_mailbox 郵箱隊列中取出一個郵件對象。當郵箱隊列為空時,函數可能阻塞等待,直到有新的郵件可供消費。函數返回0表示成功獲取郵件,非0值表示隊列為空或出現錯誤。具體實現細節被省略,實際操作中可能需要考慮線程同步問題。

  • 參數/函數講解
序號參數/函數說明
1app_test1_mail_get用于從郵箱隊列中取出一個郵件對象

<<【系列文章索引】>>

請添加圖片描述


總結

??感謝觀看,這里就是 同步與通信篇 – 消息隊列和郵箱處理,如果覺得有幫助,請給文章點個贊吧,讓更多的人看到。🌹 🌹 🌹

在這里插入圖片描述

??也歡迎你,關注我。👍 👍 👍

??原創不易,還希望各位大佬支持一下,你們的點贊、收藏和留言對我真的很重要!!!💕 💕 💕 最后,本文仍有許多不足之處,歡迎各位認真讀完文章的小伙伴們隨時私信交流、批評指正!下期再見。🎉

更多專欄訂閱:

  • 😀 【LeetCode題解(持續更新中)】

  • 🥇 【恒玄BES】

  • 🌼 【鴻蒙系統】

  • 💎 【藍牙協議棧】

  • 🎃 【死機分析】

  • 👑 【Python腳本筆記】

  • 🚝 【Java Web項目構建過程】

  • 💛 【微信小程序開發教程】

  • ? 【JavaScript隨手筆記】

  • 🤩 【大數據學習筆記(華為云)】

  • 🦄 【程序錯誤解決方法(建議收藏)】

  • 🔐 【Git 學習筆記】

  • 🚀 【軟件安裝教程】



訂閱更多,你們將會看到更多的優質內容!!

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

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

相關文章

經典FC游戲web模擬器--EmulatorJS

簡介 EmulatorJS是一個基于JavaScript和Webassembly技術的虛擬環境的實現&#xff0c;可以在網頁中運行各種經典FC游戲系統&#xff0c;支持任天堂、世嘉、雅達利等經典紅白機。EmulatorJS的誕生使得諸如超級瑪麗、坦克大戰、魂斗羅等經典FC游戲能夠以一種全新的方式回歸。本文…

SAP MM模塊的ATP檢查

前面幾篇文章都演示和說明ATP的一些設置和操作&#xff0c;通常情況下ATP的檢查PP模塊&#xff0c;SD模塊用的相對來說是比較多的&#xff0c;但是實際上MM模塊也會遵循ATP的可用性的檢查規則。 當我們在做311、301等移動類型時&#xff0c;系統會根據相應的可用性檢查規則&am…

Linux常用指令匯總

Linux常用指令匯總 Cfilt 功能&#xff1a;解析C程序中被修飾的符號&#xff0c;比如變量與函數名稱。 示例&#xff1a; 解析編譯器 g 修飾的函數名稱。 cfilt -s gnu-v3 _Z5printRKSs print(std::basic_string<char, std::char_traits<char>, std::allocator<…

Django 多對多關系

多對多關系作用 Django 中&#xff0c;多對多關系模型的作用主要是為了表示兩個模型之間的多對多關系。具體來說&#xff0c;多對多關系允許一個模型的實例與另一個模型的多個實例相關聯&#xff0c;反之亦然。這在很多實際應用場景中非常有用&#xff0c;比如&#xff1a; 博…

【每日一個Git命令: cherry-pick】

git cherry-pick 命令的作用是將指定的提交&#xff08;commit&#xff09;應用到其他分支上。這個命令允許你選擇一個或多個已有的提交&#xff0c;并將它們作為新的提交引入到當前分支中。 這個過程不會改變項目的歷史記錄&#xff0c;因為它實際上是創建了這些提交的副本。…

BMA530 運動傳感器

型號簡介 BMA530是博世&#xff08;bosch-sensortec&#xff09;的一款運動傳感器。時尚簡約的可穿戴設備為功能強大的組件提供了很小的空間。具有先進功能集的下一代加速度計是世界上最小的加速度傳感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它專為緊湊型設備而設計&…

24/07/02數據結構(1.1201)算法效率順序表

數據結構基本內容:1.時間復雜度 空間復雜度2.順序表鏈表3.棧 隊列4.二叉樹5.排序 數據結構是存儲,組織數據的方式.指相互之間存在一種或多種特定關系的數據元素的集合 算法是定義良好的計算過程.取一個或一組值為輸入并產生一個或一組值為輸出. 需要知道雖然選擇題有20-30個…

Leetcode1114 交替打印 FooBar及其測試

題目描述 相關標簽 相關企業 給你一個類&#xff1a; class FooBar { public void foo() { for (int i 0; i < n; i) { print(“foo”); } } public void bar() { for (int i 0; i < n; i) { print(“bar”); } } } 兩個不同的線程將會共用一個 FooBar 實例&#xf…

python自動化運維--DNS處理模塊dnspython

1.dnspython介紹 dnspython是Pyhton實現的一個DNS工具包&#xff0c;他幾乎支持所有的記錄類型&#xff0c;可以用于查詢、傳輸并動態更新ZONE信息&#xff0c;同事支持TSIG&#xff08;事物簽名&#xff09;驗證消息和EDNS0&#xff08;擴展DNS&#xff09;。在系統管理方面&a…

Linux高并發服務器開發(九)Tcp狀態轉移和IO多路復用

文章目錄 0 包裹函數1 多進程服務器流程代碼 2 多線程服務器3 TCP狀態轉移半關閉心跳包 4 端口復用5 IO多路復用技術高并發服務器 6 select代碼總結 7 POLLAPI代碼poll相對select的優缺點 8 epoll&#xff08;重點&#xff09;API監聽管道代碼EPOLL 高并發服務器 9 Epoll的兩種…

Iot解決方案開發的體系結構模式和技術

前言 Foreword 計算機技術起源于20世紀40年代&#xff0c;最初專注于數學問題的基本原理&#xff1b;到了60年代和70年代&#xff0c;它以符號系統為中心&#xff0c;該領域首先開始面臨復雜性問題&#xff1b;到80年代&#xff0c;隨著個人計算的興起和人機交互的問題&#x…

【進階篇】Java 項目中對使用遞歸的理解分享

前言 筆者在最近的項目開發中&#xff0c;遇到了兩個父子關系緊密相關的場景&#xff1a;評論樹結構、部門樹結構。具體的需求如&#xff1a;找出某條評論下的所有子評論id集合&#xff0c;找出某個部門下所有的子部門id集合。 在之前的項目開發經驗中&#xff0c;遞歸使用得是…

centos7安裝python3.10

文章目錄 1. 安裝依賴項2. 下載Python 3.10源碼3. 解壓源碼并進入目錄4. 配置安裝選項5. 編譯并安裝Python6. 驗證安裝7.創建軟連接8. 安裝pip39. 換源 1. 安裝依賴項 sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2-devel…

Eureka的自擴展之道:服務自動擴展的秘訣

&#x1f31f; Eureka的自擴展之道&#xff1a;服務自動擴展的秘訣 在微服務架構中&#xff0c;服務的自動擴展是實現高可用性和彈性伸縮的關鍵。Eureka作為Netflix開源的服務發現框架&#xff0c;提供了一套機制來支持服務的自動擴展。本文將詳細介紹Eureka如何實現服務的自動…

【LeetCode】十、二分查找法:尋找峰值 + 二維矩陣的搜索

文章目錄 1、二分查找法 Binary Search2、leetcode704&#xff1a;二分查找3、leetcode35&#xff1a;搜索插入位置4、leetcode162&#xff1a;尋找峰值5、leetcode74&#xff1a;搜索二維矩陣 1、二分查找法 Binary Search 找一個數&#xff0c;有序的情況下&#xff0c;直接…

第4章:Electron主窗口與子窗口管理

4.1 創建主窗口 主窗口是 Electron 應用啟動后顯示的第一個窗口&#xff0c;通常用來承載應用的主界面。我們使用 BrowserWindow 類來創建主窗口。 4.1.1 創建主窗口的基礎代碼 // 引入 Electron 模塊和 Node.js 的 path 模塊 const { app, BrowserWindow } require(electr…

【動態規劃 前綴和】2478. 完美分割的方案數

本文涉及知識點 劃分型dp 動態規劃匯總 C算法&#xff1a;前綴和、前綴乘積、前綴異或的原理、源碼及測試用例 包括課程視頻 LeetCode 2478. 完美分割的方案數 給你一個字符串 s &#xff0c;每個字符是數字 ‘1’ 到 ‘9’ &#xff0c;再給你兩個整數 k 和 minLength 。 如…

【C++ Primer Plus學習記錄】指針和const

可以用兩種不同的方式將const關鍵字用于指針。第一種方法是讓指針指向一個常量對象&#xff0c;這樣就可以防止使用該指針來修改所指向的值&#xff0c;第二種方法是將指針本身聲明為常量&#xff0c;這樣可以防止改變指針指向的位置。 首先&#xff0c;聲明一個指向常量的指針…

前后端防重復提交(續)

前文介紹過前后端防重復提交的基本場景&#xff0c;簡單的情況是只發起一個異步請求&#xff0c;如果有多個異步請求怎么操作呢&#xff1f;這個要分情況看下。 如果是后端服務器的接口支持一次傳遞多個申請&#xff0c;那么可以將任務放進數組中&#xff0c;發往后端。這是最好…

074、Python 關于實例方法、靜態方法和類方法

在Python中&#xff0c;類可以定義三種類型的方法&#xff1a;實例方法、靜態方法和類方法。每種方法都有其特定的用途和調用方式。 實例方法&#xff08;Instance Methods&#xff09; 定義&#xff1a;實例方法是綁定到類實例上的方法。它們必須有一個名為self的隱式第一個參…