DELPHI 多线程(TThread类的实现)实例


本文整理自网络,侵删。

 
再做个实例总结下:

用多线程类实现,在三个PaintBox上画椭圆。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TMyThread = class(TThread)
    private
    FNum:Integer;
    protected
      procedure Execute;override;
      procedure Run;
      procedure SetNum(Value:integer);  {设置Num}
      function GetNum:integer;          {获取Num}
      constructor Create(Aswith:Boolean;ANum:Integer);  {给创建方法添加一个参数用于传递}
    public
  end;

  TForm1 = class(TForm)
    pb1: TPaintBox;
    pb2: TPaintBox;
    pb3: TPaintBox;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses SyncObjs;

const
   colors:array[0..2] of TColor =(clRed,clGreen,clBlue);

var
  MyThread:TMyThread;
  paintArr:array[0..2] of TPaintBox;
//  MyThreadArr:array[0..2] of TMyThread;  {也可用数组多个线程进行}
  Mutex:TMutex;


procedure TForm1.btn1Click(Sender: TObject);
var
  i:integer;
begin
  if Assigned(Mutex) then Mutex.Free;   {如果存在,先释放}
  Mutex:=TMutex.Create(False);           {创建互斥体,参数为创建者先不占用}
  Repaint;                               {重画窗体}
  paintArr[0]:=pb1;                       {把PaintBox1给数组paintArr[0]}
  paintArr[1]:=pb2;
  paintArr[2]:=pb3;
  for i := Low(paintArr )to High(paintArr) do
  begin
    MyThread:=TMyThread.Create(False,i);  {如果声明了线程数组类,可以在这里一起做循环多个线程操作}
  end;
end;

{ TMyThread }



constructor TMyThread.Create(ASwith: Boolean; ANum: Integer);
begin
  inherited Create(Aswith);   {继承并传参}
  SetNum(ANum);               {设置字段Num}
end;

procedure TMyThread.Execute;
begin
  inherited;
  FreeOnTerminate:=True;
  Run;
end;

function TMyThread.GetNum: integer;
begin
  Result:=FNum;
end;

procedure TMyThread.Run;
var
  i,n,x1,x2,y1,y2:integer;
begin
  n:=GetNum;
  paintArr[n].Color:=Colors[n];
  for i := 0 to 200 do
  begin
    if Mutex.WaitFor(INFINITE)=wrSignaled then  {判断互斥体有没有被占用}
    begin
      with paintArr[n] do
      begin
        x1:=Random(Width);y1:=Random(Height);
        x2:=Random(Width);y2:=Random(Height);
        Canvas.Lock;
        Canvas.Ellipse(x1,y1,x2,y2);
        Canvas.Unlock;
        Sleep(10);
      end;
    end;
    Mutex.Release;  {释放放这里为每进行一次,释放,谁拿到谁用}
  end;
//   Mutex.Release;  {释放放这里为每进行一轮循环,释放,相当于排队进行}
end;

procedure TMyThread.SetNum(Value: integer);
begin
  FNum:=Value;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Mutex.Free;
end;

end.

相关阅读 >>

Delphi 反转字符串方法2

Delphi fmx播放m4a声音文件

Delphi 提升进程权限

Delphi 任务管理器 获取窗口标题 获取窗口图标

Delphi打开"我的电脑"等特殊文件夹

Delphi中用tlistview显示数据库数据

Delphi tclientdataset的使用

Delphi 取得文件夹及下一级文件夹下的文件列表

Delphi简体中文与繁体中文的转换函数

Delphi idhttp的用法

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...