Zitat von
Whissi:
Imho muss ich hier nun synchronisieren, nur wie bzw. womit?
Eigentlich nicht. Würde ich aber trotzdem machen.
Beispiel
VCL Komponenten und Threads: (brauchst einen Button (Button1) und ein Textfeld (Edit1).
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
TMyThread =
class(TThread)
private
FEdit: TEdit;
FHash:
String;
procedure Sync;
protected
procedure Execute;
override;
public
constructor Create(Edit: TEdit; Hash:
String);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{--------------------------------------------------------------------------------------------------}
constructor TMyThread.Create(Edit: TEdit; Hash:
String);
begin
inherited Create(True);
FEdit := Edit;
FHash := Hash;
end;
{--------------------------------------------------------------------------------------------------}
procedure TMyThread.Sync;
begin
FEdit.Text := FHash;
end;
{--------------------------------------------------------------------------------------------------}
procedure TMyThread.Execute;
begin
Synchronize(Sync);
end;
{--------------------------------------------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
begin
with TMyThread.Create(Edit1, '
ABC123')
do
begin
FreeOnTerminate := True;
Resume;
end;
end;
{--------------------------------------------------------------------------------------------------}
end.
Ein Beispiel wenn du mehrere Threads hast, die die selbe Variable zum Lesen und Schreiben benutzen:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
TReadThread =
class(TThread)
protected
procedure Execute;
override;
end;
TWriteThread =
class(TThread)
protected
procedure Execute;
override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
Safe: TMultiReadExclusiveWriteSynchronizer;
procedure TReadThread.Execute;
begin
with Safe
do
begin
BeginRead;
// hier kannst du sicher von deiner Variablen lesen
EndRead;
end;
end;
procedure TWriteThread.Execute;
begin
with Safe
do
begin
BeginWrite;
// hier kannst du sicher in deine Variablen schreiben
EndWrite;
end;
end;
initialization
Safe := TMultiReadExclusiveWriteSynchronizer.Create;
finalization
if Assigned(Safe)
then
Safe.Free;
end.
Das Programm hat eigentlich keinen Auftrag, es soll dir nur zeigen wie du die Delphi Komponente TMultiReadExclusiveWriteSynchronizer einsetzen kannst.
Beim Lesen: BeginRead, EndRead
Beim Schreiben: BeginWrite, EndWrite
Der Fehler der bei dir Auftritt, hat aber wohl einen anderen Grund.