unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListView.Types, FMX.ListView.Appearances,
FMX.ListView.Adapters.Base, FMX.ListView, FMX.Controls.Presentation, FMX.StdCtrls, System.Threading, FMX.Objects;
type
TBinaryData = TArray<Byte>;
TFrmMain = class(TForm)
Button1: TButton;
imgAlbert: TImage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FTask: ITask;
FData: TBinaryData;
procedure ProcessBitmap(const AData: TBinaryData);
end;
var
FrmMain: TFrmMain;
implementation
{$R *.fmx}
procedure TFrmMain.FormCreate(Sender: TObject);
var
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
//Bild nur dummy in der Form, so dass die Daten in ein Byte-Array geladen werden können
imgAlbert.Bitmap.SaveToStream(MS);
MS.Position := 0;
SetLength(FData,MS.Size);
MS.Read(FData[0],MS.Size);
finally
MS.DisposeOf;
MS := nil;
end;
end;
procedure TFrmMain.Button1Click(Sender: TObject);
begin
if Assigned(FTask) then
begin
FTask.Cancel;
FTask := nil;
Button1.Text := 'Start Task';
end else
begin
FTask := TTask.Run(procedure
var
CopyOfData: TBinaryData;
begin
while true do
begin
CopyOfData := Copy(FData); //FData muss natürlich abgesichert werden - passt aber für Beispiel. Ist ja nur ein Thread.
TThread.Queue(nil,procedure
begin
ProcessBitmap(CopyOfData);
end);
Sleep(100);
end;
end);
Button1.Text := 'Stop Task';
end;
end;
procedure TFrmMain.ProcessBitmap(const AData: TBinaryData);
var
Bitmap: TBitmap;
MS: TMemoryStream;
begin
Bitmap := TBitmap.Create;
MS := TMemoryStream.Create;
try
MS.Position := 0;
MS.Write(AData[0],Length(AData));
MS.Position := 0;
{ !!!!! Mit dieser Zeile: FEHlER ! - sonst läuft es !!!! }
Bitmap.LoadFromStream(MS);
//jetzt normalerweise Bild in der
GUI anzeigen... ist aber nicht die Fehlerursache
finally
MS.DisposeOf;
MS := nil;
Bitmap.DisposeOf;
Bitmap := nil;
end;
end;
end.