![]() |
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: ) |
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) ![]() |
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. |
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.
|
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.
|
Re: Komponente in Thread
Zitat:
Denken wir uns statt der obigen folgende execute-Methode:
Delphi-Quellcode:
Sie funktioniert zumindest bei mir ... (glaube ich :stupid: )
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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