delphi 线程教学第一节:初识多线程
// 普通编程function Accumulate(num:integer):integer;var i:integer;begin result:=0; if num<1 then exit; for i:=1 to num do result:=result+i;end;// 在 Button1 的 OnClick 事件中编写如下代码:var n,Total:integer;begin n:=100; Total:=Accumelate(n); // 等待计算结果,假设计算需要5分钟,此处就得等待5分钟。 // 这5分钟内,界面是无法访问的,是假死的。 // 计算完成,得到结果 Total=5050; DoSomeThing; //接着执行此句。end; |
// 多线程编程,此为计算线程类unit uAccumulation;interfaceuses Classes;type TAccumulationThread = class; TOnAccumulated = procedure(Sender: TAccumulationThread) of object; TAccumulationThread = class(TThread) protected procedure Execute; override; public Num: integer; Total: integer; OnAccumulated: TOnAccumulated; end;implementationprocedure TAccumulationThread.Execute;var i: integer;begin inherited; Total := 0; if Num > 0 then begin for i := 1 to Num do Total := Total + i end; // 当计算完成后,就调用 OnAccumulated 通知调用者 if Assigned(OnAccumulated) then OnAccumulated(self);end;end. |
// 调用多线程// 在FrmMain 中定义 OnAccumulated 事件函数Procedure TFrmMain.OnAccumulated(Sender:TAccumulationThread);var sum:integer;begin // 当计算完成时,计算线程就调用本事件函数。 // 我们在这里就得到了计算结果 sum:=Sender.Total; // 因为这里是线程时空,不能直接把 sum 的值显示到界面上。 // 如何正确显示,将下一章节中讲解。end;// 在Button1 的OnClick 事件中编写下面的代码var thd:TAccumulationThread;begin // 此处为主线程时空。 thd:=TAccumuationThread.Create(true); thd.OnAccumulated=Self.OnAccumulated; // Self 指是 FrmMain. thd.Num:=100; thd.Start; //启动线程,在线程时空中执行 Execute 中的代码。 // start 立即返回并执行下一条代码 DoSomeThing; // 此时,就有两个线程在同时执行。 // 1.主线程,也就是此处运行的时代码。 // 2.计算线程,也就是 Execute 中的代码,这些代码此时运行于多线程时空。 // 由于是两个线程并行在执行,故此处 DoSomeThing 马上可以执行。 // 界面也不会假死 DoSomeThing;end;delphi 线程教学第一节:初识多线程的更多相关文章
- delphi 线程教学第一节:初识多线程(讲的比较浅显),还有三个例子
http://www.cnblogs.com/lackey/p/6297115.html 几个例子: http://www.cnblogs.com/lackey/p/5371544.html
- delphi 线程教学第二节:在线程时空中操作界面(UI)
第二节:在线程时空中操作界面(UI) 1.为什么要用 TThread ? TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...
- 第一节 初识RabbitMQ
原文:第一节 初识RabbitMQ 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/87280120 1.什么 ...
- delphi 线程教学第四节:多线程类的改进
第四节:多线程类的改进 1.需要改进的地方 a) 让线程类结束时不自动释放,以便符合 delphi 的用法.即 FreeOnTerminate:=false; b) 改造 Create 的参数 ...
- delphi 线程教学第六节:TList与泛型
第六节: TList 与泛型 TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...
- 第一节,初识OpenCV3-图像的读、写、显、格式转化等
之前一直在看深度学习,突然用到了对图像处理的东西,所以过来补充一下OpenCV基础. 就顺便从网上了买了一本OpenCV 3计算机视觉这本书,这本书比较薄,但是目前已经够我用了,在这里就记录一下我的学 ...
- delphi 线程教学第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行
第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行 以 Ado 为例,常见的方法是拖一个 AdoConnection 在窗口上(或 DataModule 中), 再配合 AdoQ ...
- delphi 线程教学第五节:多个线程同时执行相同的任务
第五节:多个线程同时执行相同的任务 1.锁 设,有一个房间 X ,X为全局变量,它有两个函数 X.Lock 与 X.UnLock; 有如下代码: X.Lock; 访问资源 P; ...
- delphi 线程教学第三节:设计一个有生命力的工作线程
第三节:设计一个有生命力的工作线程 创建一个线程,用完即扔.相信很多初学者都曾这样使用过. 频繁创建释放线程,会浪费大量资源的,不科学. 1.如何让多线程能多次被复用? 关键是不让代码退出 ...
随机推荐
- linux c编程:信号(四) sigaction
signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受到了一定的限制.而 POSIX 标准定义的信号处理接口是 sigaction 函数, ...
- (转)jquery $.proxy的使用
在某些情况下,我们调用Javascript函数时候,this指针并不一定是我们所期望的那个.例如: 1 //正常的this使用 2 $('#myElement').click(function() { ...
- ubuntu 安装 phpstorm
phpstorm是用JAVA开发的,所以在安装之前需要先安装jdksudo apt-get install default-jdk从官网上下载phpstorm 的linux版本 http://www. ...
- php......房屋租赁练习
多条件查询搜索页面,提交到当前页面处理 <?php include("../DB.class.php"); $db = new DB(); /*var_dump($_POST ...
- 每天一个Linux命令(17)whereis命令
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. (1)用法: 用法: w ...
- php线程pthread实践
php有线程吗?----有,但是需要扩展pthreads,扩展方式网上有一堆的教程,这是只做线程demo. file_put_contents(dirname(__FILE__).'/1.txt', ...
- zabbix实现mysql数据库的监控(四)
前面介绍的内容都是用第三方开发好的插件进行mysql监控的,可能有些我们关心的监控内容并不在其中,这时一种常用的方法就是定义我们自己的脚本并将它整合到zabbix中,从而在原有监控的基础上进行有力的补 ...
- OpenStack Neutron 之 Load Balance
OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请 ...
- 一组带Tooltip提示框的CSS3图标按钮
在线演示 本地下载
- bzoj 2005: [Noi2010]能量采集 筛法||欧拉||莫比乌斯
2005: [Noi2010]能量采集 Time Limit: 10 Sec Memory Limit: 552 MB[Submit][Status][Discuss] Description 栋栋 ...