delphi Parallel 之 TTask 初試

来源:http://www.cnblogs.com/Jiaojiawang/archive/2017/09/08/7495367.html
-Advertisement-
Play Games

輸出結果 有時候,輸出結果是: 測試結果: 1 WaitForAll 不會阻塞主線程。 2 100 個 TTask 不會創建100個線程,不用寫代碼就可得到 【線程池】 一樣的功能! 3 無法判斷 Task 全部結束?? 4 線程中涉及到 【介面】時要多註意! 測試環境: win10 + delph ...


unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Generics.Collections;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    procedure TaskProc(Sender: TObject);
    function FutureEvent(Sender: TObject): string;
  public
    { Public declarations }
  end;


var
  Form1: TForm1;



implementation

{$R *.dfm}

uses
  System.Threading, System.SyncObjs, System.Diagnostics;

procedure TForm1.Button1Click(Sender: TObject);
var
  ATask: ITask;
begin
  ATask := TTask.Run(Self, Form1.TaskProc);
  ATask.Start;
  //阻塞至線程結束
  ATask.Wait;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ATask: IFuture<string>;
begin
  ATask := TTask.Future<string>(function: string
    begin
      TThread.Sleep(3000);
      Result := DateTimeToStr(Now);
    end);
  //阻塞至線程結束
  Caption := ATask.Value;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  ATask: IFuture<string>;
begin
  ATask := TTask.Future<string>(Self, FutureEvent);
  //阻塞至線程結束
  Caption := ATask.Value;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  TaskArray: TArray<ITask>;
  I: Integer;
begin
  SetLength(TaskArray, 5);
  for I := Low(TaskArray) to High(TaskArray) do
    TaskArray[I] := TTask.Run(procedure
      begin
        TThread.Sleep(1000);
      end);
  //阻塞至線程結束
  TTask.WaitForAll(TaskArray);
  ShowMessage('ok');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

function TForm1.FutureEvent(Sender: TObject): string;
begin
  Result := DateTimeToStr(Now);
end;

procedure TForm1.TaskProc(Sender: TObject);
var
  I: Integer;
begin
  TThread.Sleep(3000);
  for I := 0 to 10 do
    TThread.Queue(nil, procedure
      begin
        Memo1.Lines.Add(Sender.ClassName);
      end);
end;

end.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、首先我們先講一下ref與out的區別和使用方法; 1、ref與out的區別: out:需要在使用前聲明變數,分配地址但不能賦值,但是需要在使用中的時候需要初始化(進入方法體中的時候需要先賦值在使用),至於為什麼要在方法體中使用,我個人認為是為了區別ref;(即只出不進) ref:需要在使用前聲明 ...
  • 請求過來,根據ip和埠,由iis伺服器進行接收,如果是靜態文件則直接返迴文件內容,如果無法解析,則根據映射規則找到對應請求尾碼 的ASPNET_ISAPI.dll處理程式集,交由其進行處理。 1.此時會生成IsapRuntime,其創建了WorkRequest對象, 2.接下來實例化HttpRun ...
  • HttpContext是ASP.NET中的核心對象,每一個請求都會創建一個對應的HttpContext對象,我們的應用程式便是通過HttpContext對象來獲取請求信息,最終生成響應,寫回到HttpContext中,完成一次請求處理。在前面幾章中也都有提到HttpContext,本章就來一起探索一 ...
  • 網站中的設置實現方式有好幾種,其中有將設置類序列化然後保存到文件中(例如使用XML序列化然後以XML形式保存在文件中),或者將設置信息保存到資料庫中。 保存到資料庫中的方式就是將設置的項作為key,設置的值作為value,以key-value(鍵值對)的形式保存。 下麵使用保存到資料庫中的例子來說明 ...
  • 問題描述:給定一個字元串,找出這個字元串中最長的不重覆串。 比如:對於字元串"abba",那麼返回的結果應該是"ab"或者"ba"(返回一個即可);對於字元串"acbba",返回的應是"acb" 思路一:利用HaspMap,map的key存儲的是字元,value存儲的是字元當前的位置 1、如果當前字 ...
  • 經歷無數苦難,好不容易,網站終於上線了。=。=內牛滿面ing。chengmingwei.top就是本員工管理系統的主頁啦。是的,很簡陋,但是畢竟是第一次嘛,所以慢慢來嘛。 如上次所說的(網站簡介,見:http://www.cnblogs.com/mingwei-cheng/p/7458269.htm ...
  • 1 #!/usr/bin/env python 2 # _author: bruce 3 # @DATe : 2017-09-08 4 5 proud_list = [ 6 ('iphone6s',6800), 7 ('ipad',3000), 8 ('mac book',9800) 9 ] 10 ... ...
  • 安裝JDK/安裝JRE以及配置java環境變數對於java初學者來說是一件比較頭疼的事情,這邊分享一個簡單的批處理命令,助大家一步完成JDK或者單獨安裝JRK的需求。 關鍵步驟: 1.新建一個.txt文檔,複製附件一/附件二到文檔中; 2.修改文檔中的內容: 附件一:start /WAIT jdk- ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...