未来空中的红绿灯 發表於 2020-6-23 14:21:00

Delphi XE10 RTL - PPL - TTask

<p><span style="font-size: 16px"><strong>Delphi XE10&nbsp; RTL - PPL - TTask</strong></span></p>
<p><span style="font-size: 16px">并行编程库(PPL --Parallel Programming Library) ,让您的应用程序可以在跨平台应用中有效的使用多个CPU并行运行任务的能力。</span></p>
<p><span style="font-size: 16px"><strong>TTask(并行运行多个任务) 说明:</strong></span></p>
<ul>
<li><span style="font-size: 16px">TTask的实例是一个可以在并行于其他正在运行的任务的线程中完成单个任务或工作内容。</span></li>
<li><span style="font-size: 16px">TTask类创建和管理由ITask接口生成的任务实例,可以是TTask的实例,其继承类或与ITask接口兼容的其他类型。</span></li>
<li><span style="font-size: 16px">与任务相关联的过程可以与其他相似任务或当前正在运行的其他线程相关联的过程并行运行。哪些任务将并行运行以及何时运行,由目标平台运行时环境可用的线程资源来确定。</span></li>
<li><span style="font-size: 16px">可以使用Create构造函数创建适合并行执行的任务。使用构造函数创建后的任务过程在调用Start方法之后被视为可以执行。</span></li>
<li><span style="font-size: 16px">ITask的WaitForAll,WaitForAny和Wait方法用于显式中止调用线程的执行,以等待任何或所有正在运行的任务。</span></li>
<li><span style="font-size: 16px">要取消执行任何任务,请调用ITask相关实例的 Cancel方法。</span></li>
<li><span style="font-size: 16px">可以直接使用Run方法创建和管理任务过程以执行,类似于调用Create并随后立即调用Start。</span></li>
<li><span style="font-size: 16px">对于在程序中的某个较晚一点需要返回值的任务,可以使用通用函数Future来启动任务,以确定与其他任务并行的所需值; 然后在之后需要时通过调用GetValue方法来获取计算值。</span></li>
<li><span style="font-size: 16px">并行执行的任务可能需要使用全局的可用资源、变量等,请使用System.SyncObjs单元的同步工具来避免可能的争用问题。</span></li>
</ul>
<p><span style="font-size: 16px">Delphi 示例:</span><br><span style="font-size: 16px">// 主线程管理任务队列,并从线程池中分配线程来完成任务。该线程池具有多少线程数,取决于设备可用CPU数量。</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:delphi;gutter:true;"><span style="font-size: 16px">uses
System.Threading; // 需要引用PPL库

//定义两个执行过程:
procedure NoTask; // 不使用任务的情况
procedure ApplyTask; // 使用任务的情况

procedure TForm1.ApplyTask;
var
lValue: Integer;
begin
Label1.Text := '使用Task:--';
TTask.Run(
    procedure
    begin
      Sleep(2000);   { 暂停一段时间,模拟需要计算的处理时间 }
      lValue := Random(100);
      TThread.Synchronize(nil,
      procedure
      begin
          Label1.Text := '使用Task:' + lValue.ToString;
      end);
    end);
end;

procedure TForm1.NoTask;
var
lValue: Integer;
begin
Label1.Text := '未用Task--';
{ 暂停一段时间,模拟需要计算的处理时间 }
Sleep(3000);
lValue := Random(100);
Label1.Text := '未用Task:' + lValue.ToString;
end;

//创建按钮事件,当CheckBox1选中时执行任务,未选择时使用常用方式执行。
procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckBox1.IsChecked then
    ApplyTask
else
    NoTask;
end;
</span></pre>
</div>
<p><span style="font-size: 16px">  </span></p>
<p><span style="color: rgba(136, 136, 136, 1)">创建时间:2020.06.23  更新时间:</span></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!<br><br>
来源:https://www.cnblogs.com/guorongtao/p/13181869.html
頁: [1]
查看完整版本: Delphi XE10 RTL - PPL - TTask