Delphi之多线程实例
2016-06-29 09:41
435 查看
其他的我也就不多说了,说也说不好,再说这个东东因为暂时没有完全搞懂所以也不好说!之就给代码吧
program TestThread;
uses
Forms,
Main in 'Main.pas' {Form1},
TstThrd in 'TstThrd.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
===============工程文件结束===============
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Mask, TstThrd;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
newThread: TTstthread;
begin
newThread := TTstThread.Create(False);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + '0.bmp');
end;
end.
===================Main.Pas结束================
unit TstThrd;
interface
uses
Classes;
type
TTstThread = class(TThread)
private
{ Private declarations }
Answer: integer;
protected
procedure GiveAnswer;
procedure Execute; override;
end;
implementation
uses SysUtils, Main;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TTstThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TTstThread }
procedure TTstThread.GiveAnswer;
begin
Form1.Edit1.Text := IntToStr(Answer);
end;
procedure TTstThread.Execute;
var
i: integer;
begin
{ Place thread code here }
FreeOnTerminate := true;
for i := 0 to 2000000 do
begin
if Terminated then break;
inc(Answer, Round(Abs(Sin(Sqrt(i)))));
Synchronize(GiveAnswer);
end;
end;
end.
==================线程单元结束=====================
代码很简单,只是一个计算,不过这个计算却比较费时间。多线程情况下,你可以操作按钮一来就算,同时也可以来操作按钮二来载入一幅图片,不会出现程序假死状态;但是单线程就容易假死,只有等待数据计算完毕才可以在如图片。单线程的代码我就不贴了,比较容易。
最近读书学习,一边看书一边做一些例程,在此记录下来,以供自己以后查阅,我想各位大虾可以略过了。如果您不惜赐教,鄙人将万分感激!谢谢。
program TestThread;
uses
Forms,
Main in 'Main.pas' {Form1},
TstThrd in 'TstThrd.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
===============工程文件结束===============
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Mask, TstThrd;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
newThread: TTstthread;
begin
newThread := TTstThread.Create(False);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + '0.bmp');
end;
end.
===================Main.Pas结束================
unit TstThrd;
interface
uses
Classes;
type
TTstThread = class(TThread)
private
{ Private declarations }
Answer: integer;
protected
procedure GiveAnswer;
procedure Execute; override;
end;
implementation
uses SysUtils, Main;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TTstThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TTstThread }
procedure TTstThread.GiveAnswer;
begin
Form1.Edit1.Text := IntToStr(Answer);
end;
procedure TTstThread.Execute;
var
i: integer;
begin
{ Place thread code here }
FreeOnTerminate := true;
for i := 0 to 2000000 do
begin
if Terminated then break;
inc(Answer, Round(Abs(Sin(Sqrt(i)))));
Synchronize(GiveAnswer);
end;
end;
end.
==================线程单元结束=====================
代码很简单,只是一个计算,不过这个计算却比较费时间。多线程情况下,你可以操作按钮一来就算,同时也可以来操作按钮二来载入一幅图片,不会出现程序假死状态;但是单线程就容易假死,只有等待数据计算完毕才可以在如图片。单线程的代码我就不贴了,比较容易。
最近读书学习,一边看书一边做一些例程,在此记录下来,以供自己以后查阅,我想各位大虾可以略过了。如果您不惜赐教,鄙人将万分感激!谢谢。
相关文章推荐
- 郁闷的Delphi新闻
- delphi新语法之泛型实现的对象池模板
- Delphi 编码转换 Unicode gbk big5(使用LCMapString设置区域后,再用API转换)
- 提高Delphi的编译速度(bpl和bcp)
- Delphi COM编程技术三类型库(库文件中的工具栏,很全)
- delphi高手突破学习笔记之面向对象类和对象的本质
- Delphi OleVariant 类型的用法
- 在VC6.0下如何调用Delphi5.0开发的进程内COM
- 如何在Delphi中调用VC6.0开发的COM
- delphi调用C#webservice接口的中文编码问题
- 使用delphi 开发多层应用(二)为什么要使用多层开发?
- 使用delphi 开发多层应用(三)Delphi常用多层框架介绍
- 我常用的delphi 第三方控件
- Delphi反汇编内部字符串处理函数/过程不完全列表
- ACCESS技巧集(DELPHI AND SQL)
- delphi数据库存储图片
- Delphi xe FireMonkey FMX StingGrid 点击表头排序
- Delphi中inherited问题
- delphi 获取cmd命令返回并显示(笔记)
- delphi 文件拖拽获取路径(二)支持多文件(笔记)