デルファイスレッド教育セクションI:知人マルチスレッド

:より転載https://www.cnblogs.com/lackey/p/6297115.html

セクションI:知人のマルチスレッド
 
1.なぜマルチスレッドプログラミングを学びますか?
 
マルチスレッド(複数のスレッドが同時に実行する)も非同期プログラミングと呼ばれ、プログラミング。
複数のスレッドで、メインインターフェイスは時間がかかるため、コードのは、「仮死」状態を生じないであろう。
複数のタスクがCPUリソースの使用を最大化し、効率を改善し、同時に行うことができるようにして、マルチスレッド。
アンドリュースプログラミングは、要件があれば、メインインターフェイスのコードは数秒かかりとして、それはANRエラーをトリガーする、マルチスレッドでなければなりません。
マルチスレッドプログラミング作業は当たり前です。マルチスレッドはマスターする必要があります!早いほど良いです!
 
デルファイ2.ネットワーク上のデモ誤解をマルチスレッド
 
APIは、複数のスレッドを使用して実装されています。初心者には適していません、特にパラメータを渡すポインタで、あまりにも難しいです。
アクセスとのインタフェースは、例えば、開始点は間違っているだろう。マルチスレッドは、UIを操作するのが得意ではありません。
人気のオンラインデモサイクル、再びのTextOut出力のホールドを取得することです。
結果はcanvas.Lockを追加する必要がありました、非常にイライラさせられます。
 
メインスレッドの3の定義
 
FrmMain(TFormは)とそのEXEプログラムを前提としています。
ボタン1(TButtonの)、EDIT1(TEDIT)及びタイマ1(TTIMER)上にFrmMain。
そこで、我々は通常、FrmMainがメインスレッドであることをメインスレッドの(UI)の定義をインタフェースします。
メインスレッドで実行する時空間符号でButton1のOnClickイベント。(このチュートリアルのスレッドが長期時空の定義を統一しています)
入力操作がEDIT1一時的なユーザのメインスレッドです。
タイマ1のコードにOnTimerイベントは、メインスレッドの時間と空間で実行されます。
してください注:マルチスレッド時空と間違えにOnTimerイベントに初心者のための最も簡単。
 
4.通常のプログラミングとマルチスレッドプログラミングの間の差
 
// 普通编程
function  Accumulate(num: integer ): integer ;
var
    i: integer ;
begin
    result:= 0 ;
    if  num< 1  then  exit;
    for  i:= 1  to  num  do
       result:=result+i;
end ;
// 在 Button1 的 OnClick 事件中编写如下代码:
var
    n,Total: integer ;
begin
    n:= 100 ;
    Total:=Accumelate(n);
    // 等待计算结果,假设计算需要5分钟,此处就得等待5分钟。
    // 这5分钟内,界面是无法访问的,是假死的。
    // 计算完成,得到结果 Total=5050;
    DoSomeThing;  //接着执行此句。
end ;
 
// 多线程编程,此为计算线程类
unit  uAccumulation;
interface
uses
   Classes;
type
   TAccumulationThread =  class ;
   TOnAccumulated =  procedure (Sender: TAccumulationThread)  of  object ;
   TAccumulationThread =  class (TThread)
   protected
     procedure  Execute; override;
   public
     Num:  integer ;
     Total:  integer ;
     OnAccumulated: TOnAccumulated;
   end ;
 
implementation
 
procedure  TAccumulationThread . Execute;
var
   i:  integer ;
begin
   inherited ;
   Total :=  0 ;
   if  Num >  0  then
   begin
     for  i :=  1  to  Num  do
       Total := Total + i
   end ;
   // 当计算完成后,就调用  OnAccumulated 通知调用者
   if  Assigned(OnAccumulated)  then
     OnAccumulated(self);
end ;
end .
 
右の単語、時制で、英語で名前を書いてください。非常に重要な、忘れないでください!
 
// 调用多线程
// 在FrmMain 中定义 OnAccumulated 事件函数
Procedure TFrmMain.OnAccumulated(Sender:TAccumulationThread);
var
   sum:integer;
begin
   // 当计算完成时,计算线程就调用本事件函数。
   // 我们在这里就得到了计算结果
   sum:=Sender.Total;
   // 因为这里是线程时空,不能直接把 sum 的值显示到界面上。
   // 如何正确显示,将下一章节中讲解。
end;
 
// 在Button1 的OnClick 事件中编写下面的代码
var
   thd:TAccumulationThread;
begin
   // 此处为主线程时空。
   thd:=TAccumuationThread.Create(true);
   thd.OnAccumulated=Self.OnAccumulated; // Self 指是 FrmMain.
   thd.Num:=100;
   thd.Start; //启动线程,在线程时空中执行 Execute 中的代码。
   //  start 立即返回并执行下一条代码 DoSomeThing;
   //  此时,就有两个线程在同时执行。
   //  1.主线程,也就是此处运行的时代码。
   //  2.计算线程,也就是 Execute 中的代码,这些代码此时运行于多线程时空。
   //  由于是两个线程并行在执行,故此处 DoSomeThing 马上可以执行。
   //  界面也不会假死
   DoSomeThing;
end;

  

 
通过比较,似乎看出多线程要写更多的代码?要用事件来传递结果来给调用者?
其实都不然,这两点均是面向对象(OO)写法,与线程类无关。
最大的不同是:异步执行,把耗时的计算任务放了入另一个线程时空!
 
多线程带来了效率,同时也带来了更多的麻烦。欲知后事如何,且听下回分解。

おすすめ

転載: www.cnblogs.com/approx/p/11852128.html