:より転載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)写法,与线程类无关。
最大的不同是:异步执行,把耗时的计算任务放了入另一个线程时空!
多线程带来了效率,同时也带来了更多的麻烦。欲知后事如何,且听下回分解。