{$R *.dfm} type
PSortArray = ^TSortArray;
TSortArray = array[0..114] ofInteger;
var
ArraysRandom: Boolean;
BubbleSortArray, SelectionSortArray, QuickSortArray: TSortArray;
{ TThreadSortForm }
procedure TThreadSortForm.PaintArray(Box: TPaintBox; const A: arrayofInteger); var
I: Integer; begin with Box do begin
Canvas.Pen.Color := clRed; for I := Low(A) to High(A) do PaintLine(Canvas, I, A[I]); end; end;
procedure TThreadSortForm.BubbleSortBoxPaint(Sender: TObject); begin
PaintArray(BubbleSortBox, BubbleSortArray); end;
procedure TThreadSortForm.SelectionSortBoxPaint(Sender: TObject); begin
PaintArray(SelectionSortBox, SelectionSortArray); end;
procedure TThreadSortForm.QuickSortBoxPaint(Sender: TObject); begin
PaintArray(QuickSortBox, QuickSortArray); end;
type
//定义一个五元数,这个结构可以携带五个泛型数据,当你临时想把一堆数据绑在一起,或不想给每个成员变量起个好名字时,用这个就挺方便。
TTuple5=TTuple<string, Integer, Integer, Integer, Integer>;
var //声明一个通道,用于线程通讯,通讯的内容,就是TTuple5了。
ch: CChannel<TTuple5>;
procedure TThreadSortForm.FormCreate(Sender: TObject); begin
//这句还是原来的。。
RandomizeArrays;
//
ch:=CChannel<TTuple5>.create;
//启动监听线程,它一直运行,没有退出,并不是因为实现它的退出功能困难,而是想随便在这传达一个想法:有些线程没必要有结束,进程退出时,操作系统会帮你清理干净的,手工清理这种线程反倒增加了不安全因素,另外它除了有工作时,其它时间一直是静默的。
go(procedure() var
d: TTuple<string, Integer, Integer, Integer, Integer>; begin whileTruedobegin
d:=ch.value; //接收线程数据,存到d变量中 // sleep(5); //如果想看排序动画的慢镜头,可以加上这句
sync(procedure() //sync函数用于在主线程中执行参数过程,其实就是Synchronize() var
box: TPaintBox;
FA, FB, FI, FJ: Integer; begin //判断线程数据是哪个线程发出的,以此确定要画在哪个paintbox上 if d.v1='BubbleSort' then
box:=ThreadSortForm.BubbleSortBox elseif d.v1='SelectionSort' then
box:=ThreadSortForm.SelectionSortBox elseif d.v1='QuickSort' then
box:=ThreadSortForm.QuickSortBox;
//bubble排序函数,它将会在线程中运行。这里只举这一个排序,另两个排序修改的地方和这个一样,太长了,不贴出来了。 procedure BubbleSort(); var
I, J, T: Integer;
A: TSortArray; begin
A:=BubbleSortArray; 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 // VisualSwap(A[J], A[J + 1], J, J + 1); //这是原示例带的,没用了,屏蔽掉
procedure TThreadSortForm.RandomizeArrays; var
I: Integer; begin // if not ArraysRandom then // begin
Randomize; for I := Low(BubbleSortArray) to High(BubbleSortArray) do
BubbleSortArray[I] := Random(170);
SelectionSortArray := BubbleSortArray;
QuickSortArray := BubbleSortArray;
ArraysRandom := True;
Repaint; // end; end;