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 中线程的初级学习
- Delphi-IOCP学习笔记<三>====工作线程和Listener
- Delphi中的线程类(学习ing)
- Delphi-IOCP学习笔记<五>===测试IOCP工作线程处理队列顺序
- 转:学习笔记: Delphi之线程类TThread
- 学习笔记: Delphi之线程类TThread
- delphi 线程学习 转发与 KeyLife富翁笔记
- Delphi 学习日记-------线程(上)
- java学习日记(线程)
- Delphi关于线程的消息处理
- Java线程学习
- Delphi 嵌入汇编学习
- Delphi与Excel的编程学习
- delphi部分学习笔记
- 学习delphi6之菜鸟级别
- java线程学习基础
- [学习日记]进程、线程和模块
- delphi真接用COM组件连接数据库学习
- Delphi 对象模型学习笔记
- 学习Delphi的一写经验之一,献给初学Delphi的兄弟们。