![]() |
Datenkopie für Thread anders erzeugen
Liste der Anhänge anzeigen (Anzahl: 1)
Moin !
Ok ich gebe zu der Titel ist etwas merkwürdig, aber ich wills mal erklären :wink: Also ich habe im Anhang mal eine ganz einfache Anwendung hinzugefügt. Die macht nix anderes als per Thread ein Bild bzw. einen MemoryStream auf Platte zu speichern. Nun muss man ja irgendwann mal den Thread einrichten und mit Daten versorgen. Das passiert hier:
Delphi-Quellcode:
Das funktioniert soweit auch alles. Allerdings läuft die Zeile ...
procedure TForm1.Button1Click(Sender: TObject);
var BlobThread : TTestThread; begin BlobThread := TTestThread.Create(); Image1.Picture.Bitmap.SaveToStream(BlobThread.Stream); BlobThread.Priority := tpLower; BlobThread.Resume; end;
Delphi-Quellcode:
... ja im MainThread ab.
Image1.Picture.Bitmap.SaveToStream(BlobThread.Stream);
Und meine Frage wäre nun ob es eine Möglichkeit gibt, das dieser Teil unabhängig vom MainThread abläuft. Denn wenn man dort mal eine größere Bilddatei mit speichern will, dann hängt der Main Thread so lange wie die Kopie erzeugt wird. Die Anwendung ist übrigens nichts wirklich sinnvolls. Mir gehts da eher um das Prinzip. |
Re: Datenkopie für Thread anders erzeugen
Einfach umkerhren ;-)
Bisher arbeitest du im Mainthread mit der Methode des Bildes. Übergeb doch einfach deinem Thread das Bild und arbeite in einer Funktion im Thread das speichern ab. |
Re: Datenkopie für Thread anders erzeugen
Moin !
Zitat:
Delphi-Quellcode:
Wobei PIC dann folgendes wäre :
procedure TTestThread.Execute;
begin PIC.Picture.Bitmap.SaveToStream(BlobThread.Stream); Stream.Position := 0; Stream.SaveToFile('Test.bmp'); end;
Delphi-Quellcode:
So gehts wie gesagt nicht.
PIC := Form1.Image1;
|
Re: Datenkopie für Thread anders erzeugen
Deswegen sollst du es ja übergeben und nicht einfach auf die Elemente aus dem Thread heraus zugreifen.
Denk aber daran, wenn du zB
Delphi-Quellcode:
schreibst, das du dann im Hauptthread und in dem Thread auf den gleichen Speicherbereich zugreifst. Hier würden sich Semaphore oder Mutexe gut machen.
constructor Create(const Picture : TBitmap; const Name : AnsiString);
|
Re: Datenkopie für Thread anders erzeugen
Moin !
Ok lassen wir die Semaphore-Thematik mal eben aussen vor.
Delphi-Quellcode:
Das würde dann ja so aussehen. Soweit funktioniert das auch. Allerdings wird das Bild dennoch nicht im Thread kopiert.
constructor TTestThread.Create(const Picture : TBitmap);
begin inherited Create(True); FreeOnTerminate := True; Stream := TMemoryStream.Create; Picture.SaveToStream(Stream); end; procedure TTestThread.Execute; begin Stream.Position := 0; Stream.SaveToFile('Test.bmp'); end; procedure TForm1.Button1Click(Sender: TObject); var BlobThread : TTestThread; begin BlobThread := TTestThread.Create(Image1.Picture.Bitmap); BlobThread.Priority := tpLower; BlobThread.Resume; end; |
Re: Datenkopie für Thread anders erzeugen
Moin !
Muss mich korrigieren. So gehts:
Delphi-Quellcode:
Aber ist das dann niicht im Endeffekt das gleiche als wenn ich schreiben würde (in Execute):
TTestThread = class(TThread)
private protected procedure Execute; override; public Stream : TMemoryStream; Pic : TBitmap; constructor Create(const Picture : TBitmap); destructor Destroy; override; end; var Form1: TForm1; implementation {$R *.dfm} constructor TTestThread.Create(const Picture : TBitmap); begin inherited Create(True); FreeOnTerminate := True; Stream := TMemoryStream.Create; Pic := Picture; end; procedure TTestThread.Execute; begin Pic.SaveToStream(Stream); Stream.Position := 0; Stream.SaveToFile('Test.bmp'); end; procedure TForm1.Button1Click(Sender: TObject); var BlobThread : TTestThread; begin BlobThread := TTestThread.Create(Image1.Picture.Bitmap); BlobThread.Priority := tpLower; BlobThread.Resume; end;
Delphi-Quellcode:
Das führt ja nachweislich zu einem Crash.
Image1.Picture.Bitmap.SaveToStream(Stream);
Wo ist dann jetzt der Unterschied? Übergebe ich so dem Create dann einen Pointer? |
Re: Datenkopie für Thread anders erzeugen
Du könntest im Thread ein TBitmpa-Feld haben und beim erstellen des Threads das Bild mittels BitBlt reinkopieren ...
|
Re: Datenkopie für Thread anders erzeugen
Moin !
Zitat:
Die Bilder sind nur zu Demo Zwecken! Das hat keinen tieferen Sinn. Damit kann man nur unkompliziert große Datenmengen erzeugen (Stichwort BMP). |
Re: Datenkopie für Thread anders erzeugen
Moin !
Ne also die letzte Variante geht auch nur (so denke ich mal) weil der Thread in der Programmunit definiert ist. Sobald der Thread in einer eigenen Unit ausgelagert ist klappt das Konstrukt nicht mehr. |
Re: Datenkopie für Thread anders erzeugen
Wieso sollte das nicht funktionieren?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 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