Einzelnen Beitrag anzeigen

Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#26

Re: Fragen zu Threads: Prozedur als Thread ausführen

  Alt 18. Sep 2004, 14:37
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat