Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponente in Thread (https://www.delphipraxis.net/36593-komponente-thread.html)

jfheins 22. Dez 2004 12:13


Komponente in Thread
 
Ist es eigentlich möglich, eine Komponente in einem Thread zu haben ?
Also, dass ich praktisch ein Kompo hab',
die aber nicht zu dem Hauptthread gehört, sondern zu nem anderem Thread?

z.B. ein Image wo der thread mit arbeitet, also Ergebnisse und Verläufe darstellt usw.
dass aber vom dem Hauptthread nicht benötigt wird ???
(Könnte man des nicht einfach im Thread erzeugen ? :gruebel: )

Bernhard Geyer 22. Dez 2004 12:42

Re: Komponente in Thread
 
Grundsätzlich kannst Du bei Komponenten mit Threads arbeiten, wenn Du die Beschränkungen der VCL bezüglich Theads und Oberflächencontrols einhälst. Dies kannst Du z.B. machen indem Du ein Art Wrapper-Control schreibst, welche sich nur um die Synchronisation bezüglich Hauptthread kümmert.

Bei den Image-Komponenten sehe ich rot. Da wird dir die VCL zu oft in die Suppe spucken.
Aber schau mal (falls Du ein paar € ausgeben kannst) DaVinci an. Dies soll in der nächsten Version Thread-Save sein.

jfheins 22. Dez 2004 15:55

Re: Komponente in Thread
 
Hab' jetzt folgenden Code.
Ist der "sicher", oder ist's nur ne Frage der Zeit, bis er kracht ???
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TPainter = class(TThread)
  private
   
  protected
    procedure Execute; override;
    procedure VCL_Create;
    procedure VCL_Free;
  end;

var
  Form1: TForm1;
  Painter: TPainter;
  Bitmap: TImage;

implementation

{$R *.dfm}

procedure TPainter.Execute;
begin
  synchronize (VCL_create);
  sleep (3000);
  synchronize (VCL_Free);
end;

procedure TPainter.VCL_create;
begin
 Bitmap := TImage.Create(nil);

 Bitmap.Parent := Form1;

 Bitmap.Left := 10;
 Bitmap.Top := 10;
 Bitmap.Width := 50;
 Bitmap.Height := 50;

 Bitmap.Canvas.Pixels[10, 10] := clRed;
end;

procedure TPainter.VCL_Free;
begin
 Bitmap.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Painter := TPainter.Create(TRUE);
 Painter.FreeOnTerminate := TRUE;
 Painter.Resume;
end;

end.

jim_raynor 22. Dez 2004 16:05

Re: Komponente in Thread
 
Solange du alle Aktionen mit der Oberfläche innerhalb von Syncronize durchführst hast du keine Probleme. Die Funktionen in Syncronize werden nämlich im Hauptthread ausgeführt. Probleme gibt es nur, wenn du direkt im Thread irgendwelche Eigenschaften anfässt.

Luckie 22. Dez 2004 16:07

Re: Komponente in Thread
 
Da du beide Aktionen in der Methode Synchronize des Threads ausfühsrt, bringt dir der Thread nichts, dann kannst du es auch gleich im Hauptthread machen.

jfheins 22. Dez 2004 16:45

Re: Komponente in Thread
 
Zitat:

Zitat von Luckie
Da du beide Aktionen in der Methode Synchronize des Threads ausfühsrt, bringt dir der Thread nichts, dann kannst du es auch gleich im Hauptthread machen.

Ist ja auch nur n' Beispiel gewesen ...
Denken wir uns statt der obigen folgende execute-Methode:
Delphi-Quellcode:
procedure TPainter.Execute;
begin
  synchronize (VCL_create);
  while not terminated do
  begin
   Bitmap.Canvas.Pixels[random(50), random(50)] := clBlack;
  end;
  synchronize (VCL_Free);
end;
Sie funktioniert zumindest bei mir ... (glaube ich :stupid: )


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 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