多线程对象有哪些方法(线程对象)
导语:「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.暂存线程
当应用程序需要用同一个线程对象的多个实例时,可以通过暂存线程以重新使用,而不是撤销线程对象然后重新创建来改善系统的性能。要暂存线程,必须维护一个已经创建的线程的列表,该列表可以由使用线程的对象维护;也可以使用全局变量来暂存线程。
当需要一个新的线程时,可以使用一个暂存的线程或创建一个新的线程。
本文内容由小梓整理编辑!