Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Thread Methode Synchronisieren ? (https://www.delphipraxis.net/181435-thread-methode-synchronisieren.html)

SyntaxXx 14. Aug 2014 13:53

Thread Methode Synchronisieren ?
 
Hallo zusammen,
nachdem ihr mir bei meinem letzten Problem schon super geholfen habt, habe ich jetzt eine weitere Frage bezüglich Threads.

Und zwar geht es um das Synchronisieren.
Ich weiß, dass man aufjedenfall synchronisieren sollte, wenn man aus einem Thread herraus etwas an der GUI ändern möchte.
Z.B. die Caption eines Labels.

Ich erstelle in meiner Anwendung 2 Threads, die beide etwas über die IdHTTP Komponente aus dem Internet laden sollen.
Dazu habe ich meine Threadklasse um eine Methode erweitert.

Delphi-Quellcode:
TThread1 = class(TThread)
  protected
    procedure Execute; override;
  private
    procedure UpdateInformation;
    content: String;
  end;
In der Prozedur "UpdateInformation" erstelle ich eine IdHTTP Komponente.
Wenn ich nun 2 Threads erstelle, bedeutet das dann, dass jeder Thread seine eigene Komponente hat oder nicht?

Angenommen, ich lade ein der Prozedur nur den Quelltext einer Seite und speichere diesen in der Variablen "content", müsste ich dann synchronisieren?
Eigentlich hätte doch jeder Thread seine eigene IdHTTP Komponente und eine eigene Variable "content" ?!

mkinzler 14. Aug 2014 13:59

AW: Thread Methode Synchronisieren ?
 
Wo ist die HTTP Komponente deklariert als lokale Variable in der Methode UpdateInformation?

SyntaxXx 14. Aug 2014 14:46

AW: Thread Methode Synchronisieren ?
 
In der Methode selbst.

Da du aber ja geziehlt nachfragst, gehe ich davon aus, dass es einen Unterschied macht ^^

himitsu 14. Aug 2014 15:55

AW: Thread Methode Synchronisieren ?
 
Als privates Feld (Variable) in der TThread1-Klasse, oder als lokale Variable in der Thread-Methode ... da hat dann jeder Thread seine eigene Variable und kann auch seine eigene TidHTTP-Instanz darin ablegen.


Zum Syncronisieren braucht man übrigens keine externen Variablen mehr.
Man kann beim Synchronize-Aufruf zwar immernoch keine Parameter übergeben, aber in anonymen Methoden kann man auf lokale Variablen zureifen.

Delphi-Quellcode:
proccedure TThread1.Execute;
var
  H: TidHttp; // kann auch in TThread1-Private deklariert sein, wenn man z.B. im Constuctor damit schon was machen/einrichten will
  S: string;
begin
  H := TidHttp.Create;
  try
    S := H.LoadFormIrgendwo;
    Synchronize(procedure
      begin
        MyForm.MyLabel.Caption := S;
      end);
  finally
    H.Free;
  end;
end;
Kurze Prozeduren, welche man nicht auch noch an anderen Stellen benötigt (ebenfalls dort drüben aufrufen will), die kann man so inline deklarieren.

Sir Rufo 14. Aug 2014 19:46

AW: Thread Methode Synchronisieren ?
 
Diese/meine Antwort aus deiner vorherigen Frage sollte das doch beantworten ... eigentlich


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz