本文整理自网络,侵删。
再做个实例总结下:
用多线程类实现,在三个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 stringgrid 实例2:1、获取 stringgrid 的行数、列数; 2、给单元赋值
更多相关阅读请进入《Delphi》频道 >>