標籤:http xe7 dia 手機 threading loop 針對 ons 使用
http://blog.csdn.net/henreash/article/details/41315183
現在多數裝置、電腦都有多個CPU單元,即使是手機也是多核的。但要在開發中使用多核的優勢,卻需要一些技巧,花費時間編寫額外的代碼。好了,現在可以使用Delphi做並行編程了。
在Delphi、C++ Builder和RAD Studio XE7中,有一個簡化並行運行任務的庫,叫做並行編程庫。
並行編程庫在System.Threading單元中,其中提供了很多有用的特性,可方便的應用在已有項目和新項目中。提供了大量便利的重載函數,可同時支援C++和Object Pascal。
這些特性包括易用的針對迴圈的並行運算,以及對運行任務、join任務(等待其他線程完成)、等待一組任務等操作提供支援的大量進階特性。支援這些功能的是一個自我管理的線程池(基於CPU數量)。
為了示範使用並行庫的簡易程度,我們寫一個計算質數的範例。
function IsPrime (N: Integer): Boolean;
var
Test: Integer;
begin
Result := True;
for Test := 2 to N - 1 do
if (N mod Test) = 0 then
begin
Result := False;
break; {jump out of the for loop}
end;
end;
擷取從1到X的質數個數的典型演算法是順序的迴圈檢查其中的每個數,將總數記錄在一個變數中(這裡是一個整數Tot)。
const
Max = 50000; // 50K
for I := 1 to Max do
begin
if IsPrime (I) then
Inc (Tot);
end;
使用新的並行庫,可把for迴圈用類函數TParallel.For替代,並傳遞一個匿名方法。
另外為避免多線程衝突,可以調用TInterlocked.Increment。
TParallel.For(1, Max, procedure (I: Integer)
begin
if IsPrime (I) then
TInterlocked.Increment (Tot);
end);
有哪些改進?
使用System.Diagnostics單元的TStopWatch類可以方便的擷取每種迴圈的已耗用時間。即使在2核虛擬機器中運行,標準迴圈用時415ms,而並行只需192ms。在Mac上時間從382ms降到90ms。
最讓人喜愛的地方是,作為語言和架構的一部分,可非常容易的加入到現有代碼中。
在開發原生代碼的時候可以利用多核裝置(包括行動裝置)的優勢。然而,在行動裝置上過多運行多線程會消耗更多電量。
Samples
其他並行編程庫的範例可見Delphi和C++內建的Conways遊戲範例:
C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\RTL\Parallel Library
C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\CPP\RTL\Parallel Library
不知道你感覺怎麼樣,我已經使用並行庫將我的舊程式提速了,編程快樂。
Delphi xe7並行編程快速入門(轉)