從程序呼叫的事件處理程式中讀取執行緒物件的欄位是否安全Synchronize?
例如:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;
type
TMyThread = class(TThread)
public
Max : Integer;
Position : Integer;
OnPositionChanged : TNotifyEvent;
procedure Execute(); override;
end;
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
procedure FormCreate(Sender: TObject);
private
procedure MyOnPositionChanged(Sender : TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
Th : TMyThread;
procedure TMyThread.Execute();
begin
while not Terminated do
begin
//doing stuffs
Sleep(500);
//position 1
Inc(Position);
//event handler
if(Assigned(OnPositionChanged)) then
begin
Synchronize(
procedure()
begin
OnPositionChanged(Self);
end
);
end;
//check for reaching the max value
if(Position = Max)
then Terminate;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//preparing thread
Th := TMyThread.Create(True);
Th.FreeOnTerminate := True;
Th.Max := ProgressBar1.Max;
Th.Position := ProgressBar1.Position;
Th.OnPositionChanged := MyOnPositionChanged;
//starting thread
Th.Start;
end;
procedure TForm1.MyOnPositionChanged(Sender : TObject);
begin
//updating progressbar
ProgressBar1.Position := (Sender as TMyThread).Position;
end;
end.
我想知道在另一個執行緒運行時從主執行緒讀取執行緒欄位是否可能存在一些執行緒安全問題
uj5u.com熱心網友回復:
是的,這通常是安全的。執行緒的Execute()方法在Synchronize()運行時被阻塞,因此在主執行緒使用欄位時執行緒不會更新欄位。
如果您碰巧有另一個執行緒更新相同的欄位而沒有 Synchronize()訪問它們,這可能會發生故障。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/509884.html
上一篇:Delphi:如何在本地DST處于活動狀態時獲取UTC時間
下一篇:結構窗格中的程序串列排序
