转:学习笔记:delphi多线程学识
学习笔记:delphi多线程知识
最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处。 Delphi的线程同步方法:
、临界区
申明一个临界资源
FLock : TRTLCriticalSection;
先初化一个临界资源对象
InitializeCriticalSection(FLock)
销毁临界资源对象
DeleteCriticalSection(FLock)
procedure TSaveThread.PushTask(pTask: pFileInfo);
begin
//进入临界资源,有线程占用后,后面的线程会阻塞
EnterCriticalSection(FLock);
try
//这里是受保护的代码
if not Assigned(FTasks) then
FTasks:= TList.Create; FTasks.Add(pTask);
finally
//离开临界资源,其他的阻塞的线程可以进入
LeaveCriticalSection(FLock);
end;
end;
这种方式还是挺简单的,和Java中的synchronized代码块方式类似
、Event事件
Event有两种状态:有信号和无信号,通过这个特性可以用于线程同步。Event相关的API也多,控制起来也比较灵活,看看他的几个方法:
CreateEvent:创建事件
SetEvent:设置为有信号状态
ResetEvent: 设置为无信号状态
PulseEvent :设置为有信号状态,接着又设置为无信号状态(有点类似于单步调试的感觉)
在线程中还是要用WaitForSingleObject来阻塞
procedure TSearchTopNThread.Execute;
begin
while not Self.Terminated do
begin
WaitForSingleObject(FEvent, INFINITE);//FEvent为无信号时阻塞,直到变为有信号时代码继续执行
.......
end;
end;
//设置事件状态为无信号,阻塞线程
procedure TForm1.Button1Click(Sender: TObject);
begin
ResetEvent(hEvent);
end; //设置事件状态为有信号,线程解除阻塞
procedure TForm1.Button2Click(Sender: TObject);
begin
SetEvent(hEvent);
end; //设置一次脉冲信号状态,先设置有信号,再设置无信号
procedure TForm1.Button3Click(Sender: TObject);
begin
PulseEvent(hEvent);
end; 、互斥对象
var hMutex: THandle; //互斥对象的句柄 function ThreadFun(p: Pointer): DWORD; stdcall;
var
i: Integer;
beginfor i := to do
begin
//使用WaitForSingleObject访问互斥对象,如果hMutex为被锁定>=1,那就等待,如果为未锁定那么就给hMutex的上锁,然后运行下面的代码
if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_ then
begin //保护中的代码
..... //代码结束后释放信号量,表示当前线程已经完成处理,后面的线程就可以获得控制权
ReleaseMutex(hMutex);
end;
end;
Result := ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hMutex := CreateMutex(nil, False, nil);//第二个参数为False表示创建的互斥对象不被任何线程拥有,也就说初始状态为未锁定,线程可以占有
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(hMutex);
end; end.
总的过程和临界区有些类似,只不过互斥对象是系统核心对象,可以跨进程,而临界区只是当前进程。有这个特性可以用于对文件等资源的并发保护。
、信号量
信号量与互斥对象的方法类似,信号量的特点是可以设置计数,就是同时可以允许多个线程同时访问同一段代码。互斥对象就是信号量为1的情况,后面的线程只能等前一个执行完,而信号量就可以允许指定多个执行。 后来在看TThread的代码时发现新的Delphi版本中有了一个好东西:TMnitor
try
TMonitor.Enter(ThreadLock);
try
SyncProcPtr.Queued := QueueEvent;
if SyncList = nil then
SyncList := TList.Create;
SyncProcPtr.SyncRec := ASyncRec;
SyncList.Add(SyncProcPtr);
SignalSyncEvent;
if Assigned(WakeMainThread) then
WakeMainThread(SyncProcPtr.SyncRec.FThread);
if not QueueEvent then
TMonitor.Wait(SyncProcPtr.Signal, ThreadLock, INFINITE)
finally
TMonitor.Exit(ThreadLock);
end;
这个代码和java中的Synchronized代码块很像,这样写起线程同步要简化不少。
转:学习笔记:delphi多线程学识的更多相关文章
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- NDK学习笔记-JNI多线程
前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...
- 毕向东udp学习笔记3多线程聊天
项目功能: 实现了多线程下的发送接收,比较好 希望可以加入GUI,类似聊天软件一样,有一个消息输入框,捕获输入消息,作为发送线程 有一个显示消息框,接收消息并显示,作为接收线程 不知道的是,当在线程中 ...
- Python Web学习笔记之多线程编程
本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...
- 学习笔记-java 多线程
背景说明: 多线程并发与管理,是java基础知识里的重点,本文根据<java核心技术第八版>中的多线程技术的学习,对知识点进行整理:这里只对基础知识点进行简单罗列,以达到对知识点有网状关联 ...
- Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
- JUC学习笔记--Thread多线程基础
实现多线程的两种方法 java 实现多线程通过两种方式1.继承Thread类 ,2.实现Runnable接口 class Newthead extends Thread{ public void ru ...
- Android应用开发学习笔记之多线程与Handler消息处理机制
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...
- 【原】Java学习笔记032 - 多线程
package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * [进程]:正在 ...
随机推荐
- 常用Linux命令收集
关闭 php-fpm: ps -ef | grep php-fpm 或 ps aux | grep php-fpm kill -USR2 32253 (对应的进程PID) kill -9 进 ...
- 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程
发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (va ...
- 学习 opencv---(8)非线性滤波:中值滤波,双边滤波
正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...
- pip安装报错:is not a supported wheel on this platform
可能的原因1:安装的不是对应python版本的库,下载的库名中cp27代表python2.7,其它同理. 可能的原因2:这个是我遇到的情况(下载的是对应版本的库,然后仍然提示不支持当前平台) 我下载到 ...
- python print及格式化
print(value,sep=' ',end='\n',file=sys.stdout, flush=False) sep=' '默认空格 print('hello','world') #hello ...
- html5 canvas-绘制贝塞尔曲线
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Solr使用入门指南
本文转自http://chuanliang2007.spaces.live.com/blog/cns!E5B7AB2851A4C9D2!499.entry?wa=wsignin1.0 由于搜索引擎功能 ...
- fiddler ios 手机抓包
前言: 环境 :手机ios ip5s .fiddler .360wifi 保证手机和电脑是局域网(同一网络) 1:下载安装fiddler 准备环境 2:配置 fiddler 对应把图勾选上 弹出框 点 ...
- Spark on YARN的部署
Spark on YARN的原理就是依靠yarn来调度Spark,比默认的Spark运行模式性能要好的多,前提是首先部署好hadoop HDFS并且运行在yarn上,然后就可以开始部署spark on ...
- Sublime 3 如何设置xftp 排除文件夹“bower_components”,“node_modules”
“bower_components”,“node_modules”这个文件夹,作为模块得引用文件,不需要下载本地进行编码,这里得文件非常多,若是不把这个两个文件夹排除掉掉话,通过xftp下载所有文件的 ...