DELPHI中线程的初步探索

时间:2010-02-27 18:00:32  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:,而且如果你运用正确,你会学习得很深入,但是没有办法,大家都不愿意好好看,我只能再提醒大家一下,DELPHI还有许多DEMO的例子给大家看,就比如下面我们要谈论的TTHREAD这个例子。这个例子在demos目录的threads里面,主要告诉大家如何建立和使用线程,它的例子还是比较简单的,让我们看一下它的源代码。先看sortThds文件。usesClasses, Graphics,...
  正文:线程的概念大家可以看书,我的理解就是让计算机同时做许多事情。

Delphi6中其实有许多例子给我们看的,就许多DELPHI程序员说,DELPHI的HELP文档都是英文的,很难看懂,对于这一点我很难苟同,因为它还是比较耐心地教导大家如何学习和使用DELPHI的,而且如果你运用正确,你会学习得很深入,但是没有办法,大家都不愿意好好看,我只能再提醒大家一下,DELPHI还有许多DEMO的例子给大家看,就比如下面我们要谈论的TTHREAD这个例子。这个例子在demos目录的threads里面,主要告诉大家如何建立和使用线程,它的例子还是比较简单的,让我们看一下它的源代码

先看sortThds文件。

uses

Classes, Graphics, ExtCtrls;



我想我们应该有比较基础的功底吧,那个uses就是用来包括库文件的,不懂的可以想想C语言里面包含的头文件。TThread是在classes文件中的,而其它两个文件包括一些控件和图像的使用,所以我们这里只要包括这3个文件就可以了。



type



{ TSortThread }



photoshop/ target=_blank class=infotextkey>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;



这里就是线程类的定义。值得注意的是,我们在看到这里的时候会有一个疑问,使用线程就是先建立这个类吗?回答是,是的。为什么呢?面向对象的语言是为windows这样可以多线程运行的操作平台所设计的,如果是DOS,那么像C语言里面就不包含什么线程的概念。而面向对象的语言,其一个最大的特点就是对象的存在,所以你不难知道威慑么需要用类来实现线程。在线程这个类的构造函数:

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

我们可以看到有一个TPaintBox的参数申明,这是一个关键。如果之前你已经运行过程序了,你可以看到有3个PaintBox在填充颜色,把它作为参数输入到构造函数中,也就表明我们的线程要操作那个颜色盒子,凭大家的聪明才智,不难会想到我们要操作的多项事务,可以从这里和线程拉扯上关系。

{ 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 TSortThread.Execute;

begin

Sort(Slice(FSortArray^, FSize));

end;

这个函数就是线程被调用时自动运行的过程,你所需要处理的内容都堆到这里来吧!就比如这个Sort函数,是由多个函数拼装起来的:

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;

{ 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. } 《DELPHI中线程的初步探索》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/12954.html


关键字:

关于《DELPHI中线程的初步探索》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td