AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threadklasse mit Event aktualisiert nicht

Ein Thema von Inspur1 · begonnen am 28. Aug 2024 · letzter Beitrag vom 29. Aug 2024
Antwort Antwort
Inspur1

Registriert seit: 28. Aug 2024
10 Beiträge
 
#1

AW: Threadklasse mit Event aktualisiert nicht

  Alt 28. Aug 2024, 06:29
Ich möchte mehrere HTML auslesen, im Event möchte ich festlegen wonach gesucht wird und die Ergebnisse den Eigenschaften übergeben.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#2

AW: Threadklasse mit Event aktualisiert nicht

  Alt 28. Aug 2024, 07:19
Du nutzt FTestProperty innerhalb des Threads und außerhalb im UI Thread, ohne irgendeine Art der Synchronisation,
wenn ich das richtig sehe.

Auf jeden Fall sollte man den Zugriff im UI Thread dann synchronisieren, aber die Frage siehe oben, was willst Du erreichen?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.493 Beiträge
 
Delphi 12 Athens
 
#3

AW: Threadklasse mit Event aktualisiert nicht

  Alt 28. Aug 2024, 09:49
vorgeschlagene Änderungen:
Delphi-Quellcode:
uses Classes, System.SyncObjs;

type
  TTestThread = class(TThread)
  private
    FTestProperty: string;
    FOnTest: TNotifyEvent;
    function GetTestProperty: string;
    procedure SetTestProperty(const AValue: string);
  protected
    FCS: TCriticalSection;
    procedure DoTest; virtual;
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
    destructor Destroy; override;
    {kann aus einem anderen Thread gelesen und verändert werden}
    property TestProperty: string read GetTestProperty write SetTestProperty;
    {wird im Hauptthread aufgerufen (ermöglicht Zugriff auf die VCL)}
    property OnTest: TNotifyEvent read FOnTest write FOnTest;
  end;

implementation

procedure TTestThread.DoTest;
begin
  if Assigned(FOnTest) then // ???: if not Assigned(FOnTest) then
    FOnTest(self);
end;

constructor TTestThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FTestProperty := 'default';
  FCS := TCriticalSection.Create;
end;

destructor TTestThread.Destroy;
begin
  FCS.Free;
  inherited;
end;

procedure TTestThread.Execute;
begin
  Synchronize(DoTest);
end;

function TTestThread.GetTestProperty: string;
begin
  FCS.Enter;
  try
    Result := FTestProperty;
  finally
    FCS.Leave;
  end;
end;

procedure TTestThread.SetTestProperty(const AValue: string);
begin
  FCS.Enter;
  try
    FTestProperty := AValue;
  finally
    FCS.Leave;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FTest := TTestThread.Create(false);
  FTest.FreeOnTerminate := false;
  FTest.OnTest := MyTest;
  FTest.Resume;
  repeat
    CheckSynchronize(10);
  until FTest.Terminated;
  Caption := FTest.TestProperty;
  FTest.Free;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz