AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Datenkopie für Thread anders erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Datenkopie für Thread anders erzeugen

Ein Thema von moelski · begonnen am 27. Apr 2009 · letzter Beitrag vom 27. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 13:07
Moin !

Ok ich gebe zu der Titel ist etwas merkwürdig, aber ich wills mal erklären

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:
procedure TForm1.Button1Click(Sender: TObject);
var BlobThread : TTestThread;
begin
  BlobThread := TTestThread.Create();
  Image1.Picture.Bitmap.SaveToStream(BlobThread.Stream);
  BlobThread.Priority := tpLower;
  BlobThread.Resume;
end;
Das funktioniert soweit auch alles. Allerdings läuft die Zeile ...
Image1.Picture.Bitmap.SaveToStream(BlobThread.Stream); ... ja im MainThread ab.

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.
Angehängte Dateien
Dateityp: zip threadtest_159.zip (558,9 KB, 1x aufgerufen)
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 13:14
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.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 13:20
Moin !

Zitat:
Übergeb doch einfach deinem Thread das Bild und arbeite in einer Funktion im Thread das speichern ab.
Wie genau meinst du das? Denn ichkann aus dem Thread nicht auf die Elemente des Formulars zugreifen. Also das geht nicht:
Delphi-Quellcode:
procedure TTestThread.Execute;
begin
  PIC.Picture.Bitmap.SaveToStream(BlobThread.Stream);
  Stream.Position := 0;
  Stream.SaveToFile('Test.bmp');
end;
Wobei PIC dann folgendes wäre :
PIC := Form1.Image1; So gehts wie gesagt nicht.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 13:46
Deswegen sollst du es ja übergeben und nicht einfach auf die Elemente aus dem Thread heraus zugreifen.
Denk aber daran, wenn du zB
constructor Create(const Picture : TBitmap; const Name : AnsiString); schreibst, das du dann im Hauptthread und in dem Thread auf den gleichen Speicherbereich zugreifst. Hier würden sich Semaphore oder Mutexe gut machen.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 14:11
Moin !

Ok lassen wir die Semaphore-Thematik mal eben aussen vor.

Delphi-Quellcode:
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;
Das würde dann ja so aussehen. Soweit funktioniert das auch. Allerdings wird das Bild dennoch nicht im Thread kopiert.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 14:41
Moin !

Muss mich korrigieren. So gehts:
Delphi-Quellcode:
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;
Aber ist das dann niicht im Endeffekt das gleiche als wenn ich schreiben würde (in Execute):
Image1.Picture.Bitmap.SaveToStream(Stream); Das führt ja nachweislich zu einem Crash.

Wo ist dann jetzt der Unterschied?

Übergebe ich so dem Create dann einen Pointer?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 14:57
Du könntest im Thread ein TBitmpa-Feld haben und beim erstellen des Threads das Bild mittels BitBlt reinkopieren ...
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 15:00
Moin !

Zitat:
Threads das Bild mittels BitBlt reinkopieren
Ne das ist nix.
Die Bilder sind nur zu Demo Zwecken! Das hat keinen tieferen Sinn. Damit kann man nur unkompliziert große Datenmengen erzeugen (Stichwort BMP).
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 15:10
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.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Datenkopie für Thread anders erzeugen

  Alt 27. Apr 2009, 16:25
Wieso sollte das nicht funktionieren?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 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