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.