`
isiqi
  • 浏览: 16826845 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Delphi线程同步

阅读更多

如果线程要调用VCL里面的内容(如:别的窗体中的控件),就需要将这个线程同步。线程同步表示交由主线程运行这段代码,各个线程都在主线程中分时间段运行。另外,要想避免多个线程同时执行同一段代码也需要将多线程同步。
临界区和互斥的作用类似,都是用来进行同步的,但它们间有以下一点差别:
临界区只能在进程内使用,也就是说只能是进程内的线程间的同步;而互斥则还可用在进程之间的;临界区所花消的时间很少,才10~15个时间片,而互斥需要400多个;临界区随着进程的终止而终止,而互斥,如果你不用closehandle()的话,在进程终止后仍然在系统内存在,也就是说它是系统全局对象;
同步的方法有:

(1)使用临界区对象。

临界区对象有两种:TRTLCriticalSection 和 CriticalSection。
 TRTLCriticalSection的用法

var
GlobalVariable:Double;

var
CriticalSection:TRTLCriticalSection;

procedure SetGlobalVariable(Value:Double);
begin
EnterCriticalSection(CriticalSection); //进入临界区
try
GlobalVariable:=Value;
finally
LeaveCriticalSection(CriticalSection); //离开临界区
end;
end;

initialization
InitializeCriticalSection(CriticalSection); //初始化
finalization
DeleteCriticalSection(CriticalSection); //删除
end.
 CriticalSection(重要区段)的用法:
var criticalsection: TCriticalsection;
创建:criticalsection := TCriticalsection.create;
使用:
criticalsection.enter;
try
...
finally
criticalsection.leave;
end;

(2)使用互斥

先在主线程中创建事件对象:
var
hMutex: THandle = 0;
...
hMutex := CreateMutex(nil, False, nil);

在线程的Execute方法中加入以下代码:
if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
//Do Something;
...
ReleaseMutex(hMutex);

最后记得要释放互斥对象:
CloseHandle(hMutex);

(3)使用信号量

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TMyThread = class(TThread)
private

protected
procedure Execute; override;
public

constructor Create; virtual;
end;

var
Form1 : TForm1;
HSem : THandle = 0 ;
implementation

{$R *.dfm}

var
tick: Integer = 0;
procedure TMyThread.Execute;
var
WaitReturn : DWord ;
begin
WaitReturn := WaitForSingleObject(HSem,INFINITE) ;
Form1.Edit1.Text := IntToStr(tick);
Inc(tick);
Sleep(10);
ReleaseSemaphore(HSem, 1, Nil)
end;

constructor TMyThread.Create;
begin
inherited Create(False);
FreeOnTerminate := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
HSem := CreateSemaphore(Nil,1,1,Nil) ;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(HSem) ;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
index: Integer;
begin
for index := 0 to 10 do
begin
TMyThread.Create;
end;
end;

end.
一般的同步对象使用Mutex对象,是因为Mutex有一个特别之处:当一个持有对象的线程DOWN掉的时候,mutex对象可以自动让其它等待这个对象的线程接受,而其它的内核对象则不具体这个功能。
之所要使用Semaphore则是因为Semaphore可以提供一个活动线程的上限,即lMaximumCount参数,这才是它的真正有用之处。

另:

TRtlCriticalSection 是一个结构体,在windows单元中定义;

是InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection等这几个kernel32.dll中的临界区操作API的参数;

TCriticalSection是在SyncObjs单元中实现的类,它对上面的那些临界区操作API函数进行了了封装,简化并方便了在Delphi的使用;

如TCriticalSection.Enter;就是调用了EnterCriticalSection这个API函数。

分享到:
评论

相关推荐

    简单的Delphi线程同步问题代码.rar

    简单的Delphi线程同步问题代码,一共有四个相关的源码,等待信号值为非0。第二个参数是超时的毫秒值,INFINITE表示永不超时}  WaitForSingleObject(SemaphoreHandle, INFINITE);  {获得控制权后,信号值减1}

    Delphi线程同步(临界区、互斥、信号量).pdf

    ### Delphi线程同步技术详解 #### 一、引言 多线程编程在现代软件开发中至关重要,尤其是在追求高效能的应用程序设计中。当多个线程试图访问共享资源时,很容易引发竞态条件(race condition),即多个线程以不可...

    delphi线程同步代码集实例

    本资料集重点讨论了如何在Delphi中实现线程同步。 在Delphi中,线程同步主要通过以下几种机制实现: 1. **事件(Events)**:事件是一种同步方式,其中一个线程等待特定事件的发生,如一个信号量被设置。例如,...

    线程同步的Delphi实例版,有多个演示程序..rar

    通过分析和运行这些程序,你可以加深对Delphi线程同步机制的理解,并学会在自己的项目中应用这些技术。 总之,理解和掌握Delphi中的线程同步技术是开发高效、稳定的多线程应用程序的关键。这个实例版的压缩包提供了...

    delphi vcl线程同步synchronize

    在Delphi VCL(Visual Component Library)环境中,线程同步是一个关键的概念,特别是在多线程编程中。Synchronize方法是Delphi中用于在主线程和工作线程之间进行通信的关键工具,确保对用户界面(UI)的操作是安全...

    Delphi多线程同步的例子

    本文将深入探讨Delphi中的多线程和线程同步,并以"SortThreads"和"delphi-thread-gui"这两个示例项目为例,讲解如何在实践中应用这些概念。 1. **多线程**:多线程允许应用程序同时执行多个独立的任务,提高程序的...

    delphi中线程同步问题

    在 Delphi 中,多线程编程常常涉及到线程同步,以确保多个线程安全地访问共享资源或执行特定操作。`Synchronize` 方法是 Delphi 中用于在主线程中安全执行代码的一种机制,尤其适用于 UI 更新。然而,在 DLL 或 ...

    delphiXE多线程同步对象及异步执行.zip

    Delphi提供了各种同步对象,如TCriticalSection、TSemaphore、TMutex等,来实现线程同步。例如,TCriticalSection用于在多线程中保护临界区,确保同一时间只有一个线程能进入该区域。使用TryEnterCriticalSection和...

    delphi多线程传递参数及同步二

    三、线程同步 当线程处理完数据后,可能需要将结果返回给主线程,或者更新主线程中的控件。由于多个线程同时访问同一资源可能导致竞态条件,所以我们需要使用同步机制。 Delphi 提供了几种同步机制,如 TEvent, ...

    delphi线程异常处理

    因此,理解并正确实现Delphi线程中的异常处理机制至关重要。 首先,让我们来看看Delphi中线程的创建。通常,我们使用TThread类来创建和管理线程。创建一个新的线程类,继承自TThread,并重写它的Execute方法,这是...

    delphi线程简单实例

    总结来说,通过这个简单的Delphi线程实例,我们了解了如何创建自定义线程类,定义线程执行的逻辑,并在主程序中启动和管理线程。在实际开发中,可以依据需求扩展线程功能,实现更复杂的并发操作。

    delphi多线程同步对象及异步执行监视CPU.zip

    本文及其示例代码,诠释System.Classes.pas中的(多)线程 和System.SyncObjs.pas (深入应用(多)线程时涉及的同步对象),System.Threading.pas线程、线程池、未来、任务及并行库的原理与应用。期待对各位同学和...

    delphi线程入门示例带文档

    本资源"delphi线程入门示例带文档"旨在帮助初学者理解并掌握Delphi中的线程编程。 线程是操作系统分配CPU时间的基本单位,每个线程都有自己的执行路径,允许程序同时执行多个任务。在Delphi中,我们可以使用TThread...

    详细描述了Delphi多线程编程,超级简单易懂

    2. **线程同步机制**:包括`TCriticalSection`、`TMutex`和`TSemaphore`等,用于确保线程间的数据安全。 3. **动态线程变量**:允许每个线程独立维护自己的变量副本。 4. **TThread变量**:用于访问与当前执行线程...

    Delphi多线程的安全问题分析及解决

    在Delphi中,多线程同步问题主要体现在以下几个方面: 1. **共享资源的访问冲突**:当多个线程尝试同时访问同一份资源(如全局变量、共享对象等)时,如果没有适当的同步措施,可能会导致数据不一致或者程序崩溃等...

    Delphi 线程安全的三种方法

    互斥非常类似于临界区,除了两个关键的区别:首先,互斥可用于跨进程的线程同步;其次,互斥能被赋予一个字符串名字,并且通过引用此名字创建现有互斥对象的附加句柄。 互斥对象可以通过 CreateMutex()函数创建,...

    delphi判断线程状态

    在Delphi编程环境中,线程(Thread)是并发执行的程序单元,用于提高应用程序的响应性和效率。在多线程编程中,了解线程的状态至关重要,因为它有助于调试、同步和控制线程的行为。本篇文章将深入探讨如何在Delphi中...

    山东蓝鸟贵薪学习DELPHI线程

    3. **线程同步与互斥**:线程同步用于控制多个线程对共享资源的访问,防止数据不一致。DELPHI提供了如TEvent、TMutex、TCriticalSection等同步对象。例如,当两个线程试图同时修改同一数据时,互斥量(TMutex)可...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    通过合理利用线程同步机制,可以有效避免并发问题,同时结合异步编程和线程池技术,能够进一步优化程序性能。在实际项目中,根据任务特性和需求选择合适的线程管理模式,是提升软件质量和用户体验的关键。

    delphi 线程的使用例子

    在多线程环境中,线程同步是必不可少的,以防止数据竞争。Delphi提供了各种同步对象,如TCriticalSection、TSemaphore和TEvent,用于控制对共享资源的访问。 6. **线程通信** 除了同步,线程间通信也是重要的。...

Global site tag (gtag.js) - Google Analytics