delphi 多线程之 TEvent 和 TLightweightEvent
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, system.SyncObjs; type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
public
{ Public declarations }
end; TMyThread = class(TThread)
protected
procedure Execute; override;
end; var
Form1: TForm1;
AEvent: TEvent;
MyThread: TMyThread; implementation {$R *.dfm} procedure Log(Msg: string);
begin
TThread.Synchronize(nil, procedure begin
Form1.Memo1.Lines.Add(Msg);
end);
end; { TMyThread } procedure TMyThread.Execute;
begin
while not Terminated do
begin
AEvent.Acquire;
Log(DateTimeToStr(Now));
TThread.Sleep();
end;
Log('Exit');
end; procedure TForm1.Button1Click(Sender: TObject);
begin
AEvent.SetEvent;
end; procedure TForm1.Button2Click(Sender: TObject);
begin
AEvent.ResetEvent;
end; procedure TForm1.CheckBox1Click(Sender: TObject);
begin
MyThread.Terminate;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
AEvent := TEvent.Create(nil, False, False, '');
MyThread := TMyThread.Create(False);
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
if not MyThread.Finished then
begin
//确保线程正常退出
MyThread.Terminate;
AEvent.SetEvent;
MyThread.WaitFor;
end;
MyThread.Free; AEvent.Free;
end; end.
AEvent := TEvent.Create(nil, False, False, ''); 第一个False, 线程是否可以执行一次. 如何为True,相当于 do while, 如果为 False , 相当于 while .
第二个False, 相当于线程是否可以直接运行,不需要SetEvent. 如果为 True , 则必须调用 SetEvent 后,线程才能运行。也就是线程启动后就被阻塞住。
当两个同时为 False 时, 就可以实现类似 PulseOneEvent 的功能。 TLightweightEvent 和 TEvent 基本上是一样的,它是从 .NET中的 System.Threading.ManualResetEventSlim 学来的。对于多核,短时间间隔效率更好,可参考 MSDN 。
delphi 多线程之 TEvent 和 TLightweightEvent的更多相关文章
- Delphi多线程详解
(整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者 ...
- 转:学习笔记:delphi多线程学识
学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处 ...
- [转]Delphi多线程编程入门(二)——通过调用API实现多线程
以下是一篇很值得看的关于Delphi多线程编程的文章,内容很全面,建议收藏. 一.入门 ㈠. function CreateThread( lpThreadAttributes: Pointer ...
- [转]Delphi多线程编程入门(一)
最近Ken在比较系统地学习Delphi多线程编程方面的知识,在网络上查阅了很多资料.现在Ken将对这些资料进行整理和修改,以便收藏和分享.内容基本上是复制粘贴,拼拼凑凑,再加上一些修改而来.各个素材的 ...
- Delphi 多线程 “尚未调用CoInitialize错误”的解决方法
在Delphi 多线程中出现“尚未调用CoInitialize错误”的解决方法 解决方法如下: function TMyThread.ExecTimer: Boolean;begin Resul ...
- delphi 多线程3
多线程程序设计 我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI .中,我们可以充分利用这一特性,编写出“多线程”的应用程序. 对以往在DOS或16位windows下写程序的 ...
- 【转】Delphi多线程编程
文章来源: http://liukun966123.my.gsdn.net/2004/10/22/4797/ Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书 ...
- DELPHI 多线程(TThread类的实现)
之前学习了用API实现,让我们再学习下用DELPHI的TThread类. 先新建一个普通的工程,再新建一个线程类File>>New>>Othre>>Delphi F ...
- Delphi 多线程的操作
Delphi 操作多线程的代码, 在项目中需要在webservice中使用多线程,程序思想如下: 1.就创建一个线程, 也就是说有两个线程,主线程和创建的线程, 主线程用于程序的别的操作,例如停止服务 ...
随机推荐
- 总结vue中父向子,子向父以及兄弟之间通信的几种方式
子向父方式1:通过props,如例子中子组件test1.vue向父组件App.vue传值 App.vue代码 <template> <div id="app"&g ...
- L347
Even Educators Believe These 7 Myths About Learning1. Individuals learn better when they receive inf ...
- PHP协程入门详解
概念 咱们知道多进程和多线程是实现并发的有效方式.但多进程的上下文切换资源开销太大:多线程开销相比要小很多,也是现在主流的做法,但其的控制权在内核,从而使用户(程序员)失去了对代码的控制,而且线程的上 ...
- maven 常用备忘录
1.maven 国内的常用中央仓库地址配置: <mirror> <id>alimaven</id> <name>aliyun maven</nam ...
- [Leetcode]27. 移除元素
题目描述: ++难度:简单++ 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 ...
- java编码与解码(一)
转:https://blog.csdn.net/heyanxi0101/article/details/80356870 java编码与解码(一) 编码表概述和常见的编码表 概述:有字符及其对应的数值 ...
- jupyter 中markdown使用
jupyter使用还是很方便的,尤其是喜欢MarkDown功能,在安装插件后可以非常清晰的看到整个文档的基本结构,下面介绍下MarkDownd的使用: 1.MarkDown必须是在命令模式是下使用的, ...
- 3--TestNG多线程
第一: 注解方式 public class MultiThreadOnAnnotation{ @test(invocationCount=10,threadPoolSize=10) public vo ...
- PXE自动装机
PXE自动装机 一.搭建PXE远程安装服务器 PXE自动装机需要桌面模式 假如不是桌面模式安装的PXE需要安装桌面模式软件包 yum groupinstall "Desktop" ...
- [err]Traceback (most recent call last): File "/usr/local/bin/pip", line 7, in <module> from pip._internal import main ImportError: No module named 'pip._internal'
Q: Traceback (most recent call last):File "/usr/local/bin/pip", line 7, in <module>f ...