您的位置:首页 > 编程语言 > Delphi

Delphi 线程学习(一)

2014-12-07 10:26 369 查看



  最近在做一个关于清理数据库的小程序,因为删除的时候需要用while循环,而且循环执行的过程中,界面总会显示出卡死的状态,经过在网上查询资料,得知有2种主流的方法可以解决这个问题,一个就是利用函数:

 
Application.ProcessMessages;//系统函数

  但是,这种方法只是在窗口接收到消息时自动把while循环挂起,并没有实现问题的真正解决。为了解决这个问题,学习了线程技术,一个进程可以有多个线程,而线程之间是共享进程的资源的,当然也包括cpu的时间片。所以解决界面卡死的现象利用线程是很好的一种方式。

  线程使用的两种方式——CreateThread 和继承TThread类

1、CreateThread函数:

 在窗体中增加一个edit,一个button。然后进行代码编写。

<1>增加全局函数MyFunc.

function MyFunc(p : Pointer) : Integer ; stdcall;

var

i : Integer;

begin

for i := 0 to 10000 do

begin

Form1.Edit1.Text := inttostr(i);

end;

end;

<2>在button的OnClick事件中调用线程:

procedure TFrom1.Button1Click(Sender : TObject );

var

ID : DWORD;

begin

CreateThread(nil,0,@MyFunc,nil,0,ID); 

end;

//var

//
hThread : THandle;

//也可以这样hThread := CreateThread(nil,0,@MyFunc,nil,CREATE_SUSPENDED,ID);

//ResumeThread(hThread);//唤醒线程

//SuspendThread(hThread);//挂起线程

<3>运行效果:

点击button后,edit中的数字有自增的变化,并且可以随意的拖动窗口。

2、继承TThread类:

<1>继承并实现Execute过程。

type 

TMyThread = class(TThread)

protected

procedure Execute ; override;

end;

procedure TMyThread.Execute;

var

i : Integer;

begin

for i := 0 to 10000 do

begin

Form1.Edit1.Text := inttostr(i);

end;

end;

<2>在button的OnClick事件中实现线程的启动

procedure Form1.Button1Click(Sender : TObject);

var

MyThread : TMyThread;

begin

MyThread.Create(false);

end;

//MyThread.Create(false);这种方式建立完成后,线程立即运行。

//MyThread.Create(true);这种方式建立完成后,线程处于挂起状态。

//MyThread.Resume;这样就可以把挂起的线程重新启动。

<3>运行效果同上。

3、互斥、同步:

  这里仅仅介绍一下简单的互斥和同步,复杂的还没学会,继续学习中。

  CreateThread函数仅仅调用了一次,如果调用了多次会怎么样,尝试一下:

CreateThread(nil,0,@MyFunc,nil,0,ID);

CreateThread(nil,0,@MyFunc,nil,0,ID);

CreateThread(nil,0,@MyFunc,nil,0,ID);

结果是发生错误,为什么?原来线程同时对edit的text进行赋值的过程发生了冲突,那想要不冲突怎么办?可以添加临界区

具体方法如下:

<1>创建临界区类

uses SyncObj;

var

CS : TCriticalSection;

<2>在form的Create事件中添加初始化代码

procedure TForm1.FormCreate(Sender : TObject);

begin

CS := TCriticalSection.Create;

end;

<3>在Form的Destroy事件中添加释放代码

procedure TForm1.FormDestroy(Sender : TObject);

begin

CS.Free;

end;

<4>修改MyFunc函数

function MyFunc(p : Pointer) : Integer ; stdcall;

begin

CS.Enter;

for i := 0 to 10000 do

begin

Form1.Edit1.Text := inttostr(i);

end;

CS.Leave;

end;

<5>运行结果:

edit的数值显示从0-10000共进行了三次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delphi 线程 界面卡死