delphi中多线程排序

unit ThSort;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, StdCtrls;

type

TThreadSortForm = class(TForm)

StartBtn: TButton;

BubbleSortBox: TPaintBox;

SelectionSortBox: TPaintBox;

QuickSortBox: TPaintBox;

Label1: TLabel;

Bevel1: TBevel;

Bevel2: TBevel;

Bevel3: TBevel;

Label2: TLabel;

Label3: TLabel;

procedure BubbleSortBoxPaint(Sender: TObject);

procedure SelectionSortBoxPaint(Sender: TObject);

procedure QuickSortBoxPaint(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure StartBtnClick(Sender: TObject);

private

ThreadsRunning: Integer;

procedure RandomizeArrays;

procedure ThreadDone(Sender: TObject);

public

procedure PaintArray(Box: TPaintBox; const A: array of Integer);

end;

var

ThreadSortForm: TThreadSortForm;

implementation

uses SortThds;

{$R *.dfm}

type

PSortArray = ^TSortArray;

TSortArray =  array[0..114] of Integer;

var

ArraysRandom: Boolean;

BubbleSortArray, SelectionSortArray, QuickSortArray: TSortArray;

{ TThreadSortForm }

procedure TThreadSortForm.PaintArray(Box: TPaintBox; const A: array of Integer);

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;

procedure TThreadSortForm.FormCreate(Sender: TObject);

begin

RandomizeArrays;

end;

procedure TThreadSortForm.StartBtnClick(Sender: TObject);

begin

RandomizeArrays;

ThreadsRunning := 3;

with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do

OnTerminate := ThreadDone;

with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do

OnTerminate := ThreadDone;

with TQuickSort.Create(QuickSortBox, QuickSortArray) do

OnTerminate := ThreadDone;

StartBtn.Enabled := False;

end;

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;

procedure TThreadSortForm.ThreadDone(Sender: TObject);

begin

Dec(ThreadsRunning);

if ThreadsRunning = 0 then

begin

StartBtn.Enabled := True;

ArraysRandom := False;

end;

end;

end.

//sort thread

unit SortThds;

interface

uses

Classes, Graphics, ExtCtrls;

type

{ TSortThread }

PSortArray = ^TSortArray;

TSortArray = array[0..MaxInt div SizeOf(Integer) - 1] of Integer;

TSortThread = class(TThread)

private

FBox: TPaintBox;

FSortArray: PSortArray;

FSize: Integer;

FA, FB, FI, FJ: Integer;

procedure DoVisualSwap;

protected

procedure Execute; override;

procedure VisualSwap(A, B, I, J: Integer);

procedure Sort(var A: array of Integer); virtual; abstract;

public

constructor Create(Box: TPaintBox; var SortArray: array of Integer);

end;

{ TBubbleSort }

TBubbleSort = class(TSortThread)

protected

procedure Sort(var A: array of Integer); override;

end;

{ TSelectionSort }

TSelectionSort = class(TSortThread)

protected

procedure Sort(var A: array of Integer); override;

end;

{ TQuickSort }

TQuickSort = class(TSortThread)

protected

procedure Sort(var A: array of Integer); override;

end;

procedure PaintLine(Canvas: TCanvas; I, Len: Integer);

implementation

procedure PaintLine(Canvas: TCanvas; I, Len: Integer);

begin

Canvas.PolyLine([Point(0, I * 2 + 1), Point(Len, I * 2 + 1)]);

end;

{ TSortThread }

constructor TSortThread.Create(Box: TPaintBox; var SortArray: array of Integer);

begin

FBox := Box;

FSortArray := @SortArray;

FSize := High(SortArray) - Low(SortArray) + 1;

FreeOnTerminate := True;

inherited Create(False);

end;

{ Since DoVisualSwap uses a VCL component (i.e., the TPaintBox) it should never

be called directly by this thread.  DoVisualSwap should be called by passing

it to the Synchronize method which causes DoVisualSwap to be executed by the

main VCL thread, avoiding multi-thread conflicts. See VisualSwap for an

example of calling Synchronize. }

procedure TSortThread.DoVisualSwap;

begin

with FBox do

begin

Canvas.Pen.Color := clBtnFace;

PaintLine(Canvas, FI, FA);

PaintLine(Canvas, FJ, FB);

Canvas.Pen.Color := clRed;

PaintLine(Canvas, FI, FB);

PaintLine(Canvas, FJ, FA);

end;

end;

{ VisusalSwap is a wrapper on DoVisualSwap making it easier to use.  The

parameters are copied to instance variables so they are accessable

by the main VCL thread when it executes DoVisualSwap }

procedure TSortThread.VisualSwap(A, B, I, J: Integer);

begin

FA := A;

FB := B;

FI := I;

FJ := J;

Synchronize(DoVisualSwap);

end;

{ The Execute method is called when the thread starts }

procedure TSortThread.Execute;

begin

Sort(Slice(FSortArray^, FSize));

end;

{ TBubbleSort }

procedure TBubbleSort.Sort(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

VisualSwap(A[J], A[J + 1], J, J + 1);

T := A[J];

A[J] := A[J + 1];

A[J + 1] := T;

if Terminated then Exit;

end;

end;

{ TSelectionSort }

procedure TSelectionSort.Sort(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

VisualSwap(A[I], A[J], I, J);

T := A[I];

A[I] := A[J];

A[J] := T;

if Terminated then Exit;

end;

end;

{ TQuickSort }

procedure TQuickSort.Sort(var A: array of Integer);

procedure QuickSort(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

VisualSwap(A[Lo], A[Hi], Lo, Hi);

T := A[Lo];

A[Lo] := A[Hi];

A[Hi] := T;

Inc(Lo);

Dec(Hi);

end;

until Lo > Hi;

if Hi > iLo then QuickSort(A, iLo, Hi);

if Lo < iHi then QuickSort(A, Lo, iHi);

if Terminated then Exit;

end;

begin

QuickSort(A, Low(A), High(A));

end;

end.

时间: 2024-10-18 00:11:02

delphi中多线程排序的相关文章

Delphi中多线程用消息实现VCL数据同步显示

Delphi中多线程用消息实现VCL数据同步显示 Lanno Ckeeke 2006-5-12 概述: delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新. 实现: 关键在于消息的发送及接收.在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据.如传递字符数组: 数组定义: const MA

关于Delphi中多线程传递参数的简单问题

http://bbs.csdn.net/topics/390513469/ unit uThread; interface uses Classes; type Th = class(TThread) private { Private declarations } protected procedure Execute; override; end; 以上是创建的一个多线程 我在另外一个单元里Unit1有一个函数 function Myfun(username,password:string)

Delphi中多线程下使用使用 UniDAC+MSSQL 需要注意的问题(连接前调用CoInitialize)

一般解决方法是在线程开始启用 CoInitialize(nil),线程结束调用 CoUninitialize .如果你使用多种数据库连接,比如三层中经常切换到MSSQL和Oracle,我们只需在判断 TUniConnection 的连接前事件 OnBeforeConnect 写下如下代码: [delphi] view plain copy print? procedure TServDBFunc.ServConnBeforeConnect(Sender: TObject); begin if (

Delphi中多线程的技巧

创建线程 MsgThread := TMsgThread.Create(False) ; //创建并执行线程 MsgThread := TMsgThread.Create(True) ; //创建线程后挂起 constructor Create(CreateSuspended: Boolean); 中的参数CreateSuspended表示创建后是否挂起线程. 2)设置线程里没有设置循环执行的话,且设置FreeOnTerminate为True,则线程执行完后就会自己释放. 3)在一个线程结束后,

DELPHI中的多线程【深入VCL源码】

线程的基础知识 线程的组成.线程有两部分组成. 1.一个是线程的内核对象,操作系统用它来对线程实施管理.内核对象也是系统用来存放线程统计信息的地方. 2.另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量. 进程从来不执行任何东西,它只是线程的容器.线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中.这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作.因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空

Delphi中线程类TThread实现多线程编程(线程同步技术、Synchronize、WaitFor……)

接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event)与Delphi中的事件有所不同.从本质上讲,Event其实就相当于一个全局的布尔变量.它有两个赋值操作:Set和ReSet,相当于把它设置为 True或False.而检查它的值是通过WaitFor操作进行.对应在Windows平台上,是三个API函数:SetEvent.ResetEvent.WaitForSignalObje

Delphi中线程类TThread 实现多线程编程

作者:Rogee出处:Http://Rogee.cnblogs.com/心得:BLOG是什么,它是一个记录学习过程的东西 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以

转:Delphi中使用比较少的一些语法

http://www.cnblogs.com/Murphieston/p/5577836.html 本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类,都应该使用overload关键字进行继承,Delphi中的对象没有什么复合的概念,在设计时,从简便的角度出发 一般都设计为耦合性较强,但是使用简单的派生类即可.构造函数不是必写的,除非“复合”这样的

Delphi中的容器类

从Delphi 5开始VCL中增加了一个新的Contnrs单元,单元中定义了8个新的类,全部都是基于标准的TList 类. TList 类 TList 类实际上就是一个可以存储指针的容器类,提供了一系列的方法和属性来添加,删除,重排,定位,存取和排序容器中的类,它是基于数组的机制来实现的容器,比较类似于C++中的Vector和Java中的 ArrayList,TList 经常用来保存一组对象列表,基于数组实现的机制使得用下标存取容器中的对象非常快,但是随着容器中的对象的增多,插入和删除对象速度会