社区
Delphi
帖子详情
Delphi可以写多线程的程序吗?可以解释一下其原理及实现机制吗?
jackjack
2002-01-10 10:39:11
...全文
115
2
打赏
收藏
Delphi可以写多线程的程序吗?可以解释一下其原理及实现机制吗?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Soft21
2002-01-12
打赏
举报
回复
大家好啊,哈哈,不错!
wwwwwwww
2002-01-10
打赏
举报
回复
DELPHI下的多线程程序设计
梁毅 李韬
我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI2.0中,我们可以充分利用这一特性,
编写出“多线程”的应用程序。
对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单
任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展
的。不过,幸运的是,在DELPHI2.0下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们
可以利用DELPHI下标准的多线程类TThread来完成我们的工作。
TThread是一个abstract(抽象)类,也就是说,并不需要根据TThread来声明变量(而且根据TThread声
明的变量也是完全无用),我们要做的是把TThread作为基类,用继承的形式来生成子类。实际上,根据
TThread来写多线程应用程序是非常容易的。
下面就是一个基本的继承TThread生成的多线程类。
QuerThrd.Pas
unitQuerThrd;
interface
uses
Classes,DBTables;
type
TQueryThreadΚclass(TThread)
private
fQuery:tQuery;
protected
procedureExecute;override;
public
constructorCreate(Suspended:Boolean;Query:
TQuery);
end;
implementation
constructor
TQueryThread.Create(Suspended:Boolean;Quer
y:TQuery);
begin
inheritedCreate(Suspended);
fQuery:ΚQuery;
FreeOnTerminate:ΚTrue;
end;
procedureTQueryThread.Execute;
begin
fQuery.Open;
end;
end.
在上面这个简单的例子中,我们构造了一个TThread的子类TQueryThread,用于在后台执行数据库查
询。在该类的Create函数中,传递了两个参数Suspended和Query,其中Suspended用于控制线程的运行,如果
Suspend为真,TQueryThread类的线程在建立后将立即被悬挂,一直到运行了Resume方法,该线程才会继续执
行,Query参数用于接受一个已经存在的Query控件(在窗体中真正的Query控件)而使它在多线程的情况下运
行。Execute是最重要的过程,它是类TQueryThread的执行部分,所有需要在这个多线程类中运行的语句都必
须写在这个过程里。
实际上构造自己的多线程类时,并不需要输入所有的这些代码,选择DELPHI的File菜单下的new选项,再
选“TThreadObject”项目,DELPHI就会为你构造基本的程序模块。然后我们可以根据需要再做相应的修改。
进程的执行:
假设我们已经建立了一个窗体FORM1,窗体中有我们将要使用的查询控件Query1。那么我们在该单元的
USES部分加入上面写的QuerThrd单元。
procedureTForm1.Button1Click(Sender:TObject);
begin
{建立一个运行的进程}
TQueryThread.Create(False,Query1);
end;
如果这个过程被执行,那么窗体中的查询控件Query1就会自动在多线程的环境下运行查询。注意
TQueryThread类中只有Create而没有Free,动态建立类以后又忘记删除是我们常犯的错误之一,不过在这里
由于我们指定了FreeOnTerminate(运行完即删除)为真,所以当Execute里的语句执行完后,TQueryThread
类占据的内存控件将被自动释放。
然而还有一个问题值得我们注意,由于同一时刻可以有多个线程同时运行,那么我们还必须解决好同步
的问题,如果几个多线程程序之间没有任何关联,那么它们之间也不会有任何冲突。但实际上,可能同时运
行几个多线程的数据库应用程序,由于需要共享相同的数据库资源,我们还需要为Query1增加一个Tsession
控件。
其实,虽然我们也许没有亲自使用过Session控件,但实际上,在所有的数据库访问时DELPHI都会自动建
立一个临时的Session控件,使用完后又动态地删除掉它。在平常的数据库编程时,用不着我们亲自来操作,
但在数据库多线程执行的情况下,为了不相互冲突,我们必须为每个数据库访问都定制自己的Session控件。
这个步骤非常简单,我们只需要在窗体中增加一个Session控件,然后给它的属性“Sessionname”写一个任
意的名字,并再在Query1的“Sessionname”中写一个相同的名字。这样我们的数据库程序就安全了。
另一类需要解决同步问题的是那些对VCL资源进行操作的程序,这类的程序非常多,好在解决的方法也非
常简单。
我们可以看下面这样一个程序:
unitBncThrd;
interface
uses
WinProcs,Classes,Graphics,ExtCtrls;
type
TBounceThreadΚclass(TThread)
private
FShape:TShape;
FXSpeed:Integer;
FYSpeed:Integer;
procedureMoveShape;
protected
procedureExecute;override;
public
constructorCreate(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer);
propertyShape:TShapereadFShape;
end;
implementation
procedureTBouad.MoveShape;
var
MaxHeight,MaxWidth:Integer;
begin
withFShapedo
begin
Left:ΚLeft+FXSpeed;
Top:ΚTop+FYSpeed;
if(LeftΙ0)or
(Left+WidthΛParent.Width)then
FXSpeed:ΚFXSpeed*-1;
if(TopΙ0)or
(Top+HeightΛParent.Height)then
FYSpeed:ΚFYSpeed*-1;
end;
end;
procedureTBounceThread.Execute;
begin
WhilenotTerminateddo
begin
Synchronize(MoveShape);
end;
end;
constructorTBounceThread.Create(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:
Integer);
begin
inheritedCreate(Suspended);
FShape:ΚShape;
FXSpeed:ΚXSpeed;{X轴走向的速度}
FYSpeed:ΚYSpeed;{Y轴走向的速度}
FreeOnTerminate:ΚTrue;
end;
end.
这是一个多线程的碰碰球游戏,你可以有多个不同的球,它们分属不同的线程,各自独立的在屏幕上碰
撞。显然,由于多个球运行的显示会同时操作VCL资源,为了安全,我们在Execute过程中的执行部分加入了
Synchronize(MoveShape)来调用MoveShape过程,实际上,在任何需要操作VCL资源的地方,例如窗体、
位图,都应加入Synchronize调用。
执行时我们可以新建一个程序,然后在USES部分加入以上的BncThrd单元,再在它的窗体FORM1上加入两
个Shape控件Shape1和Shape2,Shape1可以是一个矩形而Shape2是一个圆。加入以下的代码就可以让矩形和圆
动起来。
procedureTForm1.Button1Click(Sender:TObject);
begin
TBounceThread.Create(False,Shape1,1,2);
TBounceThread.Create(False,Shape2,2,3);
end;
Delphi
实现
的
多线程
网站内容下载器
多线程
下载技术是现代网络下载工具中常见的加速手段。它允许一个下载任务分割为多个部分,每个部分由不同的线程并行下载,从而提高整体下载速率。在互联网时代,视频资源的下载与处理已经成为日常操作的一部分。要有效地进行视频下载,首先需要对视频文件格式有一个清晰的认识。常见的视频文件格式包括但不限于:AVI(Audio Video Interleave):一种历史悠久的视频容器格式,兼容性好,可包含多种编码的音视频数据。
用
DELPHI
建立
多线程
COM服务器
用
DELPHI
建立
多线程
COM服务器
摘要:本文探讨了
多线程
COM服务器的
原理
,然后详细介绍利用
DELPHI
建立
多线程
COM服务器的方法和步骤,并给出了相应测试实例。
关键词:组件对象模型(COM)、单线程单元模式(STA)、应用
程序
服务器
本文从实践的角度,详细介绍了在
delphi
中建立
多线程
Apartment COM服务器的方法和步骤。有关线程和COM技术的详细内容,请读者参考有关书籍。为便于理解,这里对本文涉及的内
Delphi
多线程
详解
(整理自网络)
Delphi
多线程
处理 1-1
多线程
的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者说,把CPU 时间划成片,每个片分给不同的线程,这样,每个线程轮流的“挂起”和“唤醒”,由于时间片很小,给人的感觉是同时运行的。
多线程
带来如下好处:(自己阅读) ...
Delphi
7 字符串复制
机制
详解
Delphi
7 的字符串复制采用引用计数和
写
时复制
机制
,
实现
高效内存管理。字符串赋值仅复制引用而非内容,修改时才创建新副本。该
机制
确保性能但需注意:多引用共享时修改会触发复制,原始字符串不受影响;
多线程
环境需同步
写
操作;循环修改应预分配内存避免性能损耗。开发中可通过UniqueString显式控制复制,或使用TStringBuilder等替代方案处理高频修改场景。理解这一
机制
对编
写
高效安全的
Delphi
代码至关重要。
DELPHI
下的WINDOWS消息传递
机制
BLOG开了很久,专业的东西一点没
写
,今天既然已经坐下了,就
写
点东西吧,也算调整调整心绪! 开发基于WINDOWS平台的应用
程序
时,了解WINDOWS消息系统组成是非常必要的。 消息本身是作为一个记录传递给应用
程序
的,记录中包含消息的类型以及其它的信息!这个记录类型叫做TMsg,它在WINDOWS单元中声明,这里就不一一列举(偶打字很辛苦的:P) 在WIN32中预定义
Delphi
5,944
社区成员
262,941
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章