[原創][Delphi多線程]TThreadedQueue的經典使用案例.

[簡介]
常用網名: 豬頭三
出生日期: 1981.XX.XX
QQ: 643439947
個人網站: 80x86匯編小站 https://www.x86asm.org
編程生涯: 2001年~至今[共22年]
職業生涯: 20年
開發語言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
開發工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能種類: 逆向 驅動 磁盤 文件
研發領域: Windows應用軟件安全/Windows系統內核安全/Windows系統磁盤數據安全/macOS應用軟件安全
項目經歷: 磁盤性能優化/文件系統數據恢復/文件信息采集/敏感文件監測跟蹤/網絡安全檢測

[序言]
主要是記錄TThreadedQueue的經典使用方式, 注意細節:
1> TThreadedQueue 內置同步機制
2> PopItem() 方法支持同步等待, 如果隊列內容為空, 那么就會等待PushItem()放入元素
3> 如果TThreadedQueue<T>, 是對Integer類型進行泛型處理, 那么如果調用function PopItem(var AItem: T): TWaitResult; overload;的話, 會出現編譯錯誤, 解決方式, 可以調用function PopItem(var AQueueSize: Integer; var AItem: T): TWaitResult; overload;進行繞過編譯器錯誤.

[下面是經典代碼]

unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages,System.SysUtils, System.Variants, System.Classes, System.Generics.Collections,System.SyncObjs, System.Threading,Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;typeTForm1 = class(TForm)Bn_ReadThread: TButton;Memo_Result: TMemo;Bn_WriteThread: TButton;procedure Bn_ReadThreadClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormShow(Sender: TObject);procedure Bn_WriteThreadClick(Sender: TObject);private{ Private declarations }mpr_ShareQueue : TThreadedQueue<string> ;mpr_Threads_Count : Integer ;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
beginmpr_ShareQueue    := TThreadedQueue<string>.Create() ;mpr_Threads_Count := 0 ;
end;procedure TForm1.FormShow(Sender: TObject);
beginRandomize() ;Memo_Result.Lines.Clear();Bn_WriteThread.Caption := Format('2: 創建寫入線程(%d)', [mpr_Threads_Count]) ;
end;// 單個讀者線程
procedure TForm1.Bn_ReadThreadClick(Sender: TObject);
beginTTask.Run(procedurevarstr_Data : string ;begin// 循環讀取while True dobegin// 從線程同步隊列中, 獲取數據, 如果隊列沒有數據, 則會自動進入等待狀態.if mpr_ShareQueue.PopItem(str_Data) = wrSignaled thenbegin// 獲取到數據之后, 同步在界面上顯式.TThread.Synchronize(TThread.Current, procedurebeginMemo_Result.Lines.Add(str_Data) ;end);endelsebeginTThread.Synchronize(TThread.Current, procedurebeginMemo_Result.Lines.Add('讀取隊列, 異常...') ;end);end;end;end);end;// End Bn_ReadThreadClick()// 多個寫者線程(通過單擊按鈕, 反復創建多個寫者線程)
procedure TForm1.Bn_WriteThreadClick(Sender: TObject);
varstr_Data : string ;
beginInc(mpr_Threads_Count) ;str_Data := Format('%d 號線程的數據.', [mpr_Threads_Count]) ;Bn_WriteThread.Caption := Format('2: 創建寫入線程(%d)', [mpr_Threads_Count]) ;TTask.Run(procedurebegin// 隨機休眠時間TThread.Sleep((Random(5)+1)*1000) ;// 向線程同步隊列添加數據.mpr_ShareQueue.PushItem(str_Data) ;end);end;// End Bn_WriteThreadClick()end.

[運行演示效果]

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

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

相關文章

悉數六大設計原則

悉數六大設計原則 目錄 悉數六大設計原則前言?誰發明了設計模式設計原則設計原則與設計模式的關系 單一職責什么是單一職責不遵循單一職責原則的設計遵循單一職責原則的設計單一職責的優點示例代碼&#xff1a; 里氏替換原則什么是里氏替換原則示例代碼&#xff1a;違反里氏替…

解讀信創產業根基,操作系統發展歷程

信創產業根基之一操作系統 操作系統是一個關鍵的控制程序&#xff0c;負責協調、管理和控制計算機硬件和軟件資源。作為硬件的首要軟件擴展&#xff0c;它位于裸機與用戶之間&#xff0c;充當了兩者之間的橋梁。通過其核心程序&#xff0c;操作系統高效地管理著系統中的各類資源…

static修飾變量和函數

static修飾的變量和函數只能在定義它的cpp源文件中使用&#xff0c;如果在頭文件中定義&#xff0c;則需要注意 在頭文件中定義static變量和static函數&#xff1a; 變量 如果在頭文件中定義了static變量&#xff0c;那么&#xff0c;所有包含這個頭文件的源文件都會定義自己…

vm-bhyve虛擬機安裝ubuntu22版本后進入grub無法啟動

問題&#xff1a;安裝ubuntu22版本后無法啟動 安裝好ubuntu22之后&#xff0c;重啟進入了grub模式&#xff0c;沒有自動啟動ubuntu 網上查了一下&#xff0c;這算一個通病。 問題解決 在grub模式下輸入boot命令&#xff1a; boot (lvm/ubuntu--vg-ubuntu--lv)/boot error: …

有哪些兼職軟件一天能賺幾十元?盤點十個能長期做下去的掙錢軟件

在當今這個信息泛濫的時代&#xff0c;眾人紛紛尋求迅速致富的捷徑。許多人在從事兼職或副業時&#xff0c;并不期望取得巨大的成就&#xff0c;只要每天能額外收入數十元&#xff0c;便已心滿意足。 今天&#xff0c;我將帶領大家深入探究&#xff0c;揭開那些隱藏在日常生活…

【小海實習日記】Git使用規范

1.Git使用流程 1.1 從master分支拉一個分支&#xff0c;命名要符合規范且清晰。 1.2 commit到本地&#xff0c;push 到遠端。 1.3 在Gitlab創建MR&#xff0c;選擇develp分支。 1.4 如果要修改的話&#xff0c;先把Gitlab上的MR修改為Draft(修改態)&#xff0c;然后在本地修改代…

Dubbo中的Invoker與Exporter機制詳解

Dubbo作為一款成熟的高性能、輕量級的Java RPC框架&#xff0c;其核心機制之一便是Invoker與Exporter機制&#xff0c;它們在服務提供端和服務消費端扮演著至關重要的角色&#xff0c;是實現服務調用和管理的基礎。下面將詳細解析這兩個核心組件的工作原理及其在Dubbo框架中的作…

9.1.1 簡述目標檢測領域中的單階段模型和兩階段模型的性能差異及其原因

9.1目標檢測 場景描述 目標檢測&#xff08;Object Detection&#xff09;任務是計算機視覺中極為重要的基礎問題&#xff0c;也是解決實例分割&#xff08;Instance Segmentation&#xff09;、場景理解&#xff08;Scene Understanding&#xff09;、目標跟蹤&#xff08;Ob…

詳解 Spark SQL 代碼開發之用戶自定義函數

一、UDF 一進一出函數 /**語法&#xff1a;SparkSession.udf.register(func_name: String, op: T > K) */ object TestSparkSqlUdf {def main(args: Array[String]): Unit {// 創建 sparksql 環境對象val conf new SparkConf().setMaster("local[*]").setAppNam…

subline text3安裝numpy,scipy,matplotlib,pandas,sklearn,ipynb

1&#xff0c;numpy&#xff08;基礎數值算法&#xff09; 安裝&#xff0c;要是在cmd直接安裝到最后會報錯, import numpy as np ModuleNotFoundError: No module named numpy 直接進入python環境&#xff0c;輸入python -m pip install numpy就不會報錯…

【SringBoot項目中MyBatis-Plus多數據源應用實踐】

文章目錄 前言 一、Mybatis-Plus是什么&#xff1f; 二、多數據源是什么&#xff1f; 三、使用步驟 1. 新建一個SpringBoot項目 2. 引入必要的MyBatis架包 3. 新建兩個數據庫及兩張表 3.3.1 新建數據庫&#xff1a;DB_A&#xff0c;并創建一張數據表alarm_kind&#xff0c;以及…

云端數據提取:安全、高效地利用無限資源

在當今的大數據時代&#xff0c;企業和組織越來越依賴于云平臺存儲和處理海量數據。然而&#xff0c;隨著數據的指數級增長&#xff0c;數據的安全性和高效的數據處理成為了企業最為關心的議題之一。本文將探討云端數據安全的重要性&#xff0c;并提出一套既高效又安全的數據提…

淺測 長亭雷池 WAF “動態防護”

本文首發于 Anyeの小站 前言 雷池 WAF 社區版的更新速度是真快啊&#xff0c;幾乎一周一個小版本&#xff0c;倆月一個大版本&#xff0c;攻城獅們真的狠啊&#xff0c;沒法測了。 廢話不多說&#xff0c;前兩天看到了 這篇文章&#xff0c;對雷池的“動態防護”功能挺感興趣…

Android應用的基本構造及威脅(apk)

目錄 APK文件是什么 apk文件解壓后的目錄結構 apk文件的存儲位置

去掉el-table表頭右側類名是gutter,width=17px的空白區域(包括表頭樣式及表格奇偶行樣式和表格自動滾動)

代碼如下&#xff1a; <el-table:data"tableData"ref"scroll_Table":header-cell-style"getRowClass":cell-style"styleBack"height"350px"style"width: 100%"><el-table-column prop"id" l…

Scrum團隊在迭代中如何處理計劃外的工作

認為 Scrum 團隊不做計劃其實是一個誤區&#xff0c;實際上很多 Scrum 團隊在沖刺計劃會議以及在細化工作項時均會進行詳細規劃。此外&#xff0c;他們還會創建一個路線圖&#xff0c;以便顯示他們在多個沖刺中的計劃。 Scrum 團隊需要經常進行計劃&#xff0c;以便在不斷變化…

linux學習:進程

目錄 例子1 獲取當前進程的進程標識符 例子2 創建一個新的子進程 例子3 展示了父進程和子進程的進程標識符 例子4 區分父進程和子進程 例子5 區分父進程和子進程的行為 例子6 比較進程標識符來區分父進程和子進程 例子7 子進程如何修改一個變量&…

混合動力電動汽車介紹(二)

接續前一章內容&#xff0c;本篇文章介紹混合動力汽車串聯、并聯和混聯的系統組成和工作原理。 一、串聯混合動力電動汽車的系統組成和工作原理 上圖為串聯混合動力電動汽車的結構簡圖。汽車由電動機-發電機驅動行駛&#xff0c;電機控制器的動力來自油箱-發動機-發電機-發電機…

Python 爬蟲零基礎:探索網絡數據的神秘世界

Python 爬蟲零基礎&#xff1a;探索網絡數據的神秘世界 在數字化時代&#xff0c;網絡數據如同無盡的寶藏&#xff0c;等待著我們去發掘。Python爬蟲&#xff0c;作為獲取這些數據的重要工具&#xff0c;正逐漸走進越來越多人的視野。對于零基礎的學習者來說&#xff0c;如何入…

基于Spring Boot框架的分頁查詢和文件上傳

分頁查詢 分析 要想從數據庫中進行分頁查詢&#xff0c;我們要使用LIMIT關鍵字&#xff0c;格式為&#xff1a;limit 開始索引 每頁顯示的條數 假設一頁想展示10條數據 查詢第1頁數據的SQL語句是&#xff1a; select * from emp limit 0,10; 查詢第2頁數據的SQL語句是&…