DELPHI下的多线程程序设计

Delphi程序设计与开发手册:GUI设计、多线程与数据库应用 Delphi作为一个高级语言开发环境,提供了对多线程的全面支持。Delphi中的TThread类是实现多线程的关键组件,它封装了线程的基本操作,使得开发者可以较为容易地进行多线程编程。TThread类实现了以下功能:简化线程的创建和启动流程。提供了挂起、恢复和终止线程的接口。允许线程访问所属组件的线程安全方法。支持线程间的事件通知机制。Delphi自1995年推出以来,一直是快速网络应用开发的首选工具之一。 阅读详情

DELPHI下的多线程程序设计

我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI 2.0中,我们可以充分利用这一特性,编写出“多线程”的应用程序。
  对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展的。不过,幸运的是,在DELPHI2.0下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们可以利用DELPHI下标准的多线程类TThread来完成我们的工作。
  TThread是一个abstract(抽象)类,也就是说,并不需要根据TThread来声明变量(而且根据TThread声明的变量也是完全无用),我们要做的是把TThread作为基类,用继承的形式来生成子类。实际上,根据TThread来写多线程应用程序是非常容易的。
  下面就是一个基本的继承TThread生成的多线程类。
unit MainhThread;
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;Query:TQuery);
  begin
  inheritedCreate(Suspended);
  fQuery:=Query;
  FreeOnTerminate:=True;
  end;
  procedureTQueryThread.Execute;
  begin
  fQuery.Open;
  end;
 end.
  在上面这个简单的例子中,我们构造了一个TThread的子类TQueryThread,用于在后台执行数据库查询。在该类的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资源进行操作的程序,这类的程序非常多,好在解决的方法也非常简单。
  我们可以看下面这样一个程序:
  unit BncThrd;
  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ΛParent.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)来调用MoveShape过程,实际上,在任何需要操作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通过多个Timer控件执行多任务..rar 立即下载

相关推荐

DELPHI多线程分布式实时多任务系统中的应用.PDF

DELPHI多线程分布式实时多任务系统中的应用.PDFDELPHI多线程分布式实时多任务系统中的应用.PDF

delphi 中几种多线程操作方式

因为使用 TThread 建立线程时会同时分配更多资源(譬如你自定义的成员、还有它的祖先类(TObject)分配的资源等等), 如果用 ExitThread 给草草退出了, 这些资源将得不到释放而导致内存泄露. 尽管 Delphi 提供了 EndThread(其内部调用 ExitThread), 这也不需要我们手动操作(假如非要手动操作也是件很麻烦的事情, 因为很多时候你不知道线程是什么时候执行完毕的).线程在等待时, 其中的计数也还在增加. 这也就是说: 现在并没有去处理线程的同步;

5817

ThreadServer_多线程多任务

DELPHI 多线程的实例,特共享给大家,希望能给大家有所帮助,多线程,多任务的模式,稳定性已经测试,如有修改请COPY我一份

python多线程有什么好处_多线程有哪些优点?- Python每日3题(多线程专题)

这里是Python7编程挑战-多线程专题!每天学习3个问题,包括初级,中级,高级问题各1个。今天是第2天!一起来呀,就7天!每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道。每日3题,100天之后成为大牛!如果有不明白的,给麦叔留言。[Easy] 多线程有哪些优点?思考30秒再往下翻...使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如...

weixin_28862501的博客 339

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 539

硬件工程师必看:5种ESD保护电路设计实战解析(附电路图)

本文为硬件工程师深度解析5种实战ESD保护电路设计,涵盖TVS二极管、专用保护芯片、片上防护及高速射频场景方案。通过具体电路图,详解工作原理、选型要点及PCB布局黄金法则,重点强调ESD防护设计中的能量泄放路径管理与低阻抗实现,助力提升产品可靠性。

xk7n92h3p5m的博客 638

Delphi多线程处理(转载)

1-1 多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者说,把CPU 时间划成片,每个片分给不同的线程,这样,每个线程轮流的“挂起”和“唤醒”,由于时间片很小,给人的感觉是同时运行的。 多线程带来如下好处:(自己阅读) 1)避免瓶颈;...

diefei3662的博客 496

Python通用编程规范-09 安全编程规范

1.9 安全编程规范 1.9.1 异常行为 1.9.1.1 禁止抑制或者忽略已检查异常 【说明】: 编码人员常常会通过一个空的或者无意义的catch块来抑制捕获的已检查异常。每一个catch块都应该确保程序只会在继续有效的情况下才会继续运行下去。因此,catch块必须要么从异常情况中恢复,要么重新抛出适合当前catch块上下文的另一个异常以允许最邻近的外层try-catch语句块来进行恢复工作。异常会打断应用原本预期的控制流程。例如,try块中位于异常发生点之后的任何表达式和语句都不会被执行。因此,异常必须

zhao12501的博客 2871

DELPHI下的多线程程序设计(1)

DELPHI下的多线程程序设计(1)     我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI 2.0中,我们可以充分利用这一特性,编写出“多线程”的应用程序。   对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展

zou5655的专栏 2066

【实用工具】QQ自动发消息

程序下载:蓝奏云 源代码: #include<Windows.h> #include<bits/stdc++.h> #include<conio.h> using namespace std; void HideWindow() { HWND hwnd; hwnd=FindWindow("ConsoleWindowClass",NULL); if(hwnd) ShowWindow(hwnd,SW_HIDE); return; } int main() { pri

liuzich的博客 2644

Gazebo仿真平台模型搭建与修改

ROS里踩过的坑(一)Gazebo仿真平台模型搭建与修改文件讲解Models 文件World文件Launch文件模型编辑可视化编辑配置文件编辑模型展示如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出...

Redglass的博客 1万+

Delphi 知识 并行编程 Tasks

在上面这种情况下,长的和假的操作是在匿名方法中执行的。当该函数结束时,其返回值被传递给另一个匿名方法,它是一个过程,并在UI线程中运行。嗯,在通常的情况下,你考虑一个任务,这并不意味着你将不再创建线程,但是,在许多情况下,你将使用排序的任务而非普通的线程。Delphi的PPL的使用相当简单,不需要对你的应用程序进行大的改动。适用于Delphi所支持的所有平台,并提供了一些先进的功能,如运行任务、连接任务、等待任务执行等。不是一个标准的Delphi异常块,它只是一个匿名方法,实际可以获得一个异常对象。

sensor_WU 博客 2449

超详细!DeepSeek本地搭建部署、搭建知识库及智能体教程

通过以上详细的步骤,我们完成了DeepSeek的本地搭建部署、知识库的搭建以及智能体的创建。这一过程不仅让我们深入了解了大模型的应用,还为我们开发个性化的智能应用奠定了基础。在实际应用中,可以根据具体需求进一步优化模型、知识库和智能体的性能和功能。希望本文能帮助大家快速上手DeepSeek相关技术,开启属于自己的人工智能创新之旅。

Ljugg的博客 8185

DELPHI32下的多线程程序设计

我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI2.0中,我们可以充分利用这一特性,编写 出“多线程”的应用程序。 1 对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单 任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展 的。不过,幸运的是,在DELPHI2.0下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们 可以利用DELPHI下标准的多线程类TT

s13596191285的博客 193

AI原生应用架构师指南:系统化思维框架解析

随着ChatGPT、Stable Diffusion等AI技术的普及,「AI原生应用」(AI-Native Application)已从概念走向实践。传统应用以「功能逻辑」为核心(比如用代码写死的购物车规则),而AI原生应用以「数据+模型」为核心(比如根据用户行为动态推荐商品)。本文的目的是为架构师提供一套系统化思维框架如何区分「伪AI应用」和「真AI原生应用」?数据、模型、业务场景三者如何协同设计?架构师需要关注哪些关键技术节点?如何避免「为了AI而AI」的陷阱?

AI Python 编程之道的博客 491

YOLOv8 WIOU

本文介绍了如何在YOLOv8中实现WIOU(Weighted Intersection over Union)的修改方法。主要修改了ultralytics/utils/metrics.py文件中的bbox_iou函数,新增了WIoU_Scale类,支持单调性FM v2、非单调性FM v3两种模式,并提供了动态调整的动量参数。修改后的函数支持多种IoU变体(GIoU、DIoU、CIoU等),通过数学公式实现了更精确的边界框回归损失计算,特别针对小目标检测场景进行了优化。该实现使用了PyTorch框架,包含完整

FJN110的博客 2048

DELPHI下的多线程程序设计(2)

DELPHI下的多线程程序设计(2) end;   end;   procedureTBounceThread.Execute;   begin   WhilenotTerminateddo   begin   Synchronize(MoveShape);   end;   end;   constructorTBounceThread.Create(Suspended:Boolean;Shap

zou5655的专栏 1604

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

DELPHI32下的多线程程序设计梁毅

我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI2.0中,我们可以充分利用这一特性,编写出“多线程”的应用程序。 1 对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展的。不过,幸运的是,在DELPHI2.0下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们可以利用DELPHI下标准的多线程类TThread

s13596191285的博客 114

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

DELPHI下的多线程程序设计(1) (转)

DELPHI下的多线程程序设计(1) (转)[@more@]Delphi下的多线程程序设计(1)     我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI 2.0中,我们可以充分利用这一特性,编写出“多线...

csobhtdx34120的博客 83

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

DELPHI下的多线程程序设计(2) (转)

DELPHI下的多线程程序设计(2) (转)[@more@]Delphi下的多线程程序设计(2) end;   end;   procedureTBounceThread.Execute;   begin   WhilenotT...

cuiji1279的博客 66

delphi 多线程3

多线程程序设计  我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI 2.0中,我们可以充分利用这一特性,编写出“多线程”的应用程序。   对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows3.1下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展的...

dkopg24406的专栏 990

Delphi语言的死锁处理

死锁是多线程编程中一个难以避免的问题,但通过有效的策略与措施可以显著降低其发生的概率。在Delphi程序中,合理的资源管理与精良的线程设计是保证程序稳定性的重要因素。通过明确的资源请求顺序、超时机制等方式,我们可以有效地避免死锁的产生。此外,定期的死锁检测与监控也可以帮助开发者迅速识别与解决问题,提升软件系统的健壮性与可靠性。深入理解死锁的形成原因和解决方案,将有助于开发者在日常编程中更加游刃有余,确保开发出高效、稳定的多线程应用程序。

2501_91503189的博客 839

悟透delphi 第三章 多线程

古时候,有一位刚刚出道的的骑士去到牧马场挑选一匹好马。在马房和牧马人聊天的时候,他大吹特吹自己驾驭马匹的高超技能。牧马人听完他的唠叨之后说:“请你将草原上吃草的那群马引进马房,我送你一匹最好的马!”。击掌为誓之后,骑士拿起长鞭骑马出去了。过了很久,那个骑士汗流满面灰溜溜地回来了。这时牧马人语重心长地对他说:“能驾驭一匹马不一定可以驾驭一群马,你在马背上的前程还长着呢!”。骑士听了之后羞愧满面。多年

程序人生 911
Raiboi
博客等级 码龄25年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值