Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread ausführen (https://www.delphipraxis.net/103080-thread-ausfuehren.html)

Christian18 9. Nov 2007 16:23


Thread ausführen
 
Hallo,

ich beschäftige mich gerade mit Threads. Ich habe mir eine kleine Routine geschrieben, die ich ausführen lassen möchte. Da diese Routine ein bisschen Zeit in ansproch nimmt, habe ich mir überlegt das ganze in ein Thread zu packen. Leider funktioniert das nur manchmal. Könnt ihr mal draufschauen?

Vielen Dank im vorraus.

Delphi-Quellcode:
unit UThreads;

interface

uses
  Classes, ExtCtrls, Windows;

type
  TFarbe = record
    R : Integer;
    G : Integer;
    B : Integer;
  end;

type
  TMyThread = class (TThread)
  private
    FImage : TImage;
  public

  protected
    procedure Execute(); override;
  published
    property Image : TImage Read FImage Write FImage;
  end;

implementation

procedure TMyThread.Execute();
  var x, y : Integer;
      Farbe : TFarbe;
begin
  for x:=0 to FImage.Width do
    begin
      for y:=0 to FImage.Height do
        begin
          Randomize;
          with Farbe do
            begin
              R:=Random(255);
              G:=Random(255);
              B:=Random(255);

              FImage.Canvas.Pixels[x, y]:=RGB(R, G, B);
            end;
        end;
    end;
end;

end.
Ausruf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var MyThread1 : TMyThread;
      MyThread2 : TMyThread;
      MyThread3 : TMyThread;
      MyThread4 : TMyThread;
begin
  MyThread1:=TMyThread.Create(True);
  MyThread2:=TMyThread.Create(True);
  MyThread3:=TMyThread.Create(True);
  MyThread4:=TMyThread.Create(True);
  MyThread1.Image:=Image1;
  MyThread2.Image:=Image2;
  MyThread3.Image:=Image3;
  MyThread4.Image:=Image4;
  MyThread1.Resume;
  MyThread2.Resume;
  MyThread3.Resume;
  MyThread4.Resume;
end;

Luckie 9. Nov 2007 16:25

Re: Thread ausführen
 
Was heißt, "funktioniert nur manchmal"?

Und du weißt, dass man Zugriffe auf VCL-Elemente mit Synchronize synchronisieren muss?

Christian18 9. Nov 2007 16:26

Re: Thread ausführen
 
Hallo,

nein das weiss ich nicht. Die geht das denn? Also ich meine das mit dem Syncen...

Ja es funzt nur manchmal. Es bleiben immer wieder Images einfach nur weiss oder sie werden nur zur hälfte gezeichnet.

MFG Chris

Muetze1 9. Nov 2007 16:37

Re: Thread ausführen
 
Warum nutzt du überhaupt ein TImage wenn du doch nur die TBitmap Instanz davon nutzt? Dann instanziiere lieber eine TBitmap Instanz innerhalb deines Threads und rufe mit einer durch Synchronize() synchronisierten Methode am Ende deiner Malroutine das übertragen des Bildes (nicht der Instanz, siehe Delphi-Referenz durchsuchenTBitmap.Assign()) an die Form.


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