搜索
写经验 领红包
 > 地理

多线程对象有哪些方法(线程对象)

导语:「13.多线程编程」3.线程对象的使用

多线程对象有哪些方法(线程 对象)

3. 线程对象的使用3.1 线程的同步

当线程中访问一个全局变量或对象时,容易与其他线程发生冲突,我们需要在代码执行完一个操作之前阻塞其他进程的执行。Delphi 支持三种方法来避免其他线程与用户线程访问同样的内存区域。

1.锁住对象

为了避免其他线程使用某个对象实例,可以锁住该对象。

比如:画布对象,调用 TCanvas.Lock 方法可以防止其他线程在画布上绘制,直到对应的线程调用了 Unlock 方法。在多线程应用程序中,使用该方法可以保护画布。

2.使用临界区

如果对象没有内建锁定的功能,可以使用临界区。临界区一次只允许一个进程进入。

要使用临界区,就要创建一个全局的TcriticalSection对象。该对象有两个方法:

Acquire - 阻塞其他线程执行临界区代码Release - 释放阻塞

每个临界区都和要保护的全局内存相联系,每个线程在访问一个全局内存之前都应首先调用 Acquire 方法以确保没有其他线程使用它,访问结束后,线程应该调用 Release 方法使其他线程可以通过调用 Acquire 方法访问该全局内存。

3.使用 multi-read-exclusive-write 同步

当我们使用临界区保护全局内存时,每次只有一个线程可以使用该内存区,这样的保护可能满足不了需求。

在多线程中,同时读一个变量没有任何危险,而变量赋值则不同。这时,可以使用TMultiReadExclusiveWriteSynchronizer 类来保护它,该类类似一个临界区,但它允许多线程同时读取被它保护的内存。

3.2 执行线程

要使用线程,首先需要创建一个线程类的实例。

创建一个立即启动的线程类实例,需要将构造函数的 CreateSuspended 参数设置为 false 即可,如:

FirstThread := TMyThread.Create(false);

可以创建多个线程类实例来执行代码。

1.重载优先级

一般情况下,我们在构造函数中指定线程的优先级。但是,如果线程的优先级依赖于线程何时执行,就应该创建可以进入挂起状态的线程,设置线程的优先级,然后开始执行线程。如:

Var  FirstProcess: TMyThread;begin  FirstProcess:=TMyThread。Create(True);  FirstProcess.Priorty:=tplower;  FirstProcess.Resume;end;

2.启动和停止线程

Susppend - 临时中止一个线程,该方法增加了一个内部的计数,需要恢复线程的时候,用 Resume 方法

Resume - 对挂起的线程恢复运行

Terminated - 该方法将线程的 Terminated 属性设置为 True 并提前停止线程的执行

3.暂存线程

当应用程序需要用同一个线程对象的多个实例时,可以通过暂存线程以重新使用,而不是撤销线程对象然后重新创建来改善系统的性能。要暂存线程,必须维护一个已经创建的线程的列表,该列表可以由使用线程的对象维护;也可以使用全局变量来暂存线程。

当需要一个新的线程时,可以使用一个暂存的线程或创建一个新的线程。

本文内容由小梓整理编辑!