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.如何让多线程能多次被复用? 关键是不让代码退出 ...
随机推荐
- valuestack,stackContext,ActionContext.之间的关系以及action的数据在页面中取得的方法
转自:http://blog.csdn.net/quechao123/article/details/4406148 1.三者之间的关系如下图所示: 2.action的数据在页面中取得的方法 在st ...
- 华为机试ACM(字符组合问题)
今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...
- 【Mybatis】Insert批量操作
话不多说,直接上代码. <insert id="pesistRT" parameterType="com.test.model.RTSummarizer" ...
- Swift URL encode
前言 在WEB前端开发,服务器后台开发,或者是客户端开发中,对URL进行编码是一件很常见的事情,但是由于各个年代的RFC文档中的内容一直在变化,一些年代久远的代码就对URL编码和解码的规则和现在的有一 ...
- ubuntu android studio 编译及运行错误Error retrieving parent for item: No resource found that matches the given name
安装好android studio并且安装其它需要的SDK或组件后,根据向导生成新的项目, 编译或运行时可能会出现下面的错误: Error:Error retrieving parent for it ...
- 【leetcode刷题笔记】Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 题解:因为题 ...
- POJ 1068 Parencodings (类似括号的处理问题)
Pare ...
- Nginx Rewrite语法详解
重写中用到的指令 if (条件) {} 设定条件,再进行重写 set #设置变量 return #返回状态码 return 403; break #跳出rewrite rewrite #重写 I ...
- JAVAScript中DOM与BOM的差异分析
JAVAScript 有三部分构成,ECMAScript,DOM和BOM,根据浏览器的不同,具体的表现形式也不尽相同.我们今天来谈一谈DOM和BOM这俩者之间的差异. 用百科上的来说: 1. DOM是 ...
- 关于ansible变量的一个问题
ansible-playbook 使用with_items 时 items中 如果有变量 {} 外面可以用 “” items中 如果都是固定值,没有用到变量,{}最外面不要加 “” ,不然报错,mmp