源代码:(只有一个源文件)
unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;type
TForm1 = class(TForm)
SSI: TImage;
QSI: TImage;
BSI: TImage;
Exit: TBitBtn;
Start: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure ExitClick(Sender: TObject);
procedure StartClick(Sender: TObject);
procedure PrintImages(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; //选择排序线程
SSThread=class(TThread)
protected
procedure Execute;override;
procedure SSort(var A: array of Integer);
private
arrnum:array[1..200]of integer;
end; //冒泡排序线程
BSThread=class(TThread)
protected
procedure Execute;override;
procedure BSort(var A: array of Integer);
private
arrnum:array[1..200]of integer;
end; //快速排序线程
QSThread=class(TThread)
protected
procedure Execute;override;
procedure QSort(var A: array of Integer; iLo, iHi: Integer);
private
arrnum:array[1..200]of integer;
end;var
Form1: TForm1;
SS:SSThread;
BS:BSThread;
QS:QSThread;implementation{$R *.dfm}
///////////************类中方法**************//////////////////////////
procedure SSThread.SSort(var A: array of Integer); //var A: array of Integer
var
I, J, T: Integer;
begin
for I := Low(A) to High(A) - 1 do
for J := High(A) downto I + 1 do
if A[I] > A[J] then
begin
T := A[I];
A[I] := A[J];
A[J] := T;
if Terminated then begin
Form1.PrintImages(Form1);
exit;
end;
end;
end;procedure SSThread.Execute;
begin
SSort(arrnum);
end;
///////////************类中方法**************//////////////////////////procedure BSThread.BSort(var A: array of Integer); //var A: array of Integer
var
I, J, T: Integer;
begin
for I := High(A) downto Low(A) do
for J := Low(A) to High(A) - 1 do
if A[J] > A[J + 1] then
begin
T := A[J];
A[J] := A[J + 1];
A[J + 1] := T;
if Terminated then begin
Form1.PrintImages(Form1);
exit;
end;
end;
end;procedure BSThread.Execute;
begin
BSort(arrnum);
end;///////////************类中方法**************//////////////////////////
procedure QSThread.QSort(var A: array of Integer; iLo, iHi: Integer);//var A: array of Integer; iLo, iHi: Integer
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
if Terminated then begin
Form1.PrintImages(Form1);
exit;
end;
until Lo > Hi;
if Hi > iLo then QSort(A, iLo, Hi);
if Lo < iHi then QSort(A, Lo, iHi);
end;procedure QSThread.Execute;
begin
QSort(arrnum,1,200);
end;
///////////************类中方法**************//////////////////////////procedure TForm1.FormCreate(Sender: TObject);
var
k,t:integer;
begin
SS:=SSThread.Create(true);
BS:=BSTHread.Create(true);
QS:=QSThread.Create(true);
for k:=1 to 200 do
begin
t:=random(200);
SS.arrnum[k]:=t;
BS.arrnum[k]:=t;
QS.arrnum[k]:=t;
end;
PrintImages(Form1);
end;procedure TForm1.ExitClick(Sender: TObject);
begin
application.terminate;
end;
/////////////////***********开始并发排序************/////////////////////
procedure TForm1.StartClick(Sender: TObject);
begin
SS.Resume;
BS.Resume;
QS.Resume;
end;
/////////////////***********完成并发排序************/////////////////////
procedure TForm1.PrintImages(Sender: TObject);
var
k:integer;
pt:array[1..3,1..200,1..2] of Tpoint;
begin
SSI.Picture.Assign(nil);
BSI.Picture.Assign(nil);
QSI.Picture.Assign(nil);
for k:=1 to 200 do
begin
pt[1,k,1].X:=0;
pt[1,k,2].X:=SS.arrnum[k];
pt[1,k,1].Y:=2*k-1;
pt[1,k,2].Y:=pt[1,k,1].Y;
pt[2,k,1].X:=0;
pt[2,k,2].X:=BS.arrnum[k];
pt[2,k,1].Y:=2*k-1;
pt[2,k,2].Y:=pt[2,k,1].Y;
pt[3,k,1].X:=0;
pt[3,k,2].X:=QS.arrnum[k];
pt[3,k,1].Y:=2*k-1;
pt[3,k,2].Y:=pt[3,k,1].Y;
end;
for k:=1 to 200 do
begin
SSI.Canvas.Polyline(pt[1,k]);
BSI.Canvas.Polyline(pt[2,k]);
QSI.Canvas.Polyline(pt[3,k]);
end;
end;end.
运行后,点击排序,但是一点反应也没有.
unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;type
TForm1 = class(TForm)
SSI: TImage;
QSI: TImage;
BSI: TImage;
Exit: TBitBtn;
Start: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure ExitClick(Sender: TObject);
procedure StartClick(Sender: TObject);
procedure PrintImages(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; //选择排序线程
SSThread=class(TThread)
protected
procedure Execute;override;
procedure SSort(var A: array of Integer);
private
arrnum:array[1..200]of integer;
end; //冒泡排序线程
BSThread=class(TThread)
protected
procedure Execute;override;
procedure BSort(var A: array of Integer);
private
arrnum:array[1..200]of integer;
end; //快速排序线程
QSThread=class(TThread)
protected
procedure Execute;override;
procedure QSort(var A: array of Integer; iLo, iHi: Integer);
private
arrnum:array[1..200]of integer;
end;var
Form1: TForm1;
SS:SSThread;
BS:BSThread;
QS:QSThread;implementation{$R *.dfm}
///////////************类中方法**************//////////////////////////
procedure SSThread.SSort(var A: array of Integer); //var A: array of Integer
var
I, J, T: Integer;
begin
for I := Low(A) to High(A) - 1 do
for J := High(A) downto I + 1 do
if A[I] > A[J] then
begin
T := A[I];
A[I] := A[J];
A[J] := T;
if Terminated then begin
Form1.PrintImages(Form1);
exit;
end;
end;
end;procedure SSThread.Execute;
begin
SSort(arrnum);
end;
///////////************类中方法**************//////////////////////////procedure BSThread.BSort(var A: array of Integer); //var A: array of Integer
var
I, J, T: Integer;
begin
for I := High(A) downto Low(A) do
for J := Low(A) to High(A) - 1 do
if A[J] > A[J + 1] then
begin
T := A[J];
A[J] := A[J + 1];
A[J + 1] := T;
if Terminated then begin
Form1.PrintImages(Form1);
exit;
end;
end;
end;procedure BSThread.Execute;
begin
BSort(arrnum);
end;///////////************类中方法**************//////////////////////////
procedure QSThread.QSort(var A: array of Integer; iLo, iHi: Integer);//var A: array of Integer; iLo, iHi: Integer
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
if Terminated then begin
Form1.PrintImages(Form1);
exit;
end;
until Lo > Hi;
if Hi > iLo then QSort(A, iLo, Hi);
if Lo < iHi then QSort(A, Lo, iHi);
end;procedure QSThread.Execute;
begin
QSort(arrnum,1,200);
end;
///////////************类中方法**************//////////////////////////procedure TForm1.FormCreate(Sender: TObject);
var
k,t:integer;
begin
SS:=SSThread.Create(true);
BS:=BSTHread.Create(true);
QS:=QSThread.Create(true);
for k:=1 to 200 do
begin
t:=random(200);
SS.arrnum[k]:=t;
BS.arrnum[k]:=t;
QS.arrnum[k]:=t;
end;
PrintImages(Form1);
end;procedure TForm1.ExitClick(Sender: TObject);
begin
application.terminate;
end;
/////////////////***********开始并发排序************/////////////////////
procedure TForm1.StartClick(Sender: TObject);
begin
SS.Resume;
BS.Resume;
QS.Resume;
end;
/////////////////***********完成并发排序************/////////////////////
procedure TForm1.PrintImages(Sender: TObject);
var
k:integer;
pt:array[1..3,1..200,1..2] of Tpoint;
begin
SSI.Picture.Assign(nil);
BSI.Picture.Assign(nil);
QSI.Picture.Assign(nil);
for k:=1 to 200 do
begin
pt[1,k,1].X:=0;
pt[1,k,2].X:=SS.arrnum[k];
pt[1,k,1].Y:=2*k-1;
pt[1,k,2].Y:=pt[1,k,1].Y;
pt[2,k,1].X:=0;
pt[2,k,2].X:=BS.arrnum[k];
pt[2,k,1].Y:=2*k-1;
pt[2,k,2].Y:=pt[2,k,1].Y;
pt[3,k,1].X:=0;
pt[3,k,2].X:=QS.arrnum[k];
pt[3,k,1].Y:=2*k-1;
pt[3,k,2].Y:=pt[3,k,1].Y;
end;
for k:=1 to 200 do
begin
SSI.Canvas.Polyline(pt[1,k]);
BSI.Canvas.Polyline(pt[2,k]);
QSI.Canvas.Polyline(pt[3,k]);
end;
end;end.
运行后,点击排序,但是一点反应也没有.
http://topic.csdn.net/u/20080608/13/5deb18fa-4edf-4eb1-9f20-b2ad4bd50c53.html原来如此0揭帖