本文整理自网络,侵删。
unit Unit1;
interface
uses uSyncThread, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);begin TWorkingThread.Create(False); TWorkingThread.Create(False); TWorkingThread.Create(False);end;
end.
unit uSyncThread;
interface
uses System.SyncObjs, System.SysUtils, System.Classes;
type TWorkingThread = class(TThread) private { Private declarations } protected procedure Execute; override; public procedure Work(); end;
implementation
uses Unit1;{
线程安全
1、多个线程共享一块数据,保证该数据执行的结果是正确的
解决方案
1、线程同步(线程安全) 、VCL控件大部分是线程不安全的
2、Delphi的具体实现方式
a) Synchronize
b) 临界区(TCriticalSection)
c) 互斥体(TMutex)
d) 信号量(TEvent)
e) TMonitor
3、使用场景
1、当多个线程访问一个对象(数据)时,为了保证数据的正确性我们需要同步
2、线程同步:可以保证数据的安全性,慢(效率低)
3、线程异步:快(效率高)、无法保证数据的安全性
4、扩展知识 1、线程池 System.Threading.TThreadPool}
var i: Integer; CriticalSection: TCriticalSection;{ TWorkingThread }
procedure TWorkingThread.Execute;begin FreeOnTerminate := True;// Self.Synchronize(Work); CriticalSection.Enter; Work(); CriticalSection.Leave;end;
procedure TWorkingThread.Work;begin while True do begin Form1.Memo1.Lines.Add('线程编号:' + self.ThreadID.ToString + ',' + i.ToString); if i = 10 then begin Exit; end; inc(i); Self.Sleep(100); end;end;
initialization CriticalSection := TCriticalSection.Create;
finalization CriticalSection.Free;
end.
相关阅读 >>
Delphi ifileoperation替换shfileoperation
Delphi android / ios应用程序中使用tgeocoder类进行反向地理编码(从位置信息中获取地址)
Delphi firemonkey里触发home按键被按下的事件
更多相关阅读请进入《Delphi》频道 >>