Gibt's da nicht irgendeine andere Möglichkeit/Krücke, das zu lösen ? Mittels DIB o. ä. ?
Ich habe doch schon eine einfache Möglichkeit genannt... nimm einfach das
Handle statt die ganze Bitmap durch verschiedene Threads zu reichen. Hier eine schnell hingeworfene Demo, nicht schön geschrieben, aber sie zeigt, dass es so geht...
Delphi-Quellcode:
type
TTestThread = class(TThread)
protected
procedure Execute; override;
end;
TfrmThreadDemo = class(TForm)
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
FTestThread: TTestThread;
FExampleBitmap: TBitmap;
end;
var
frmThreadDemo: TfrmThreadDemo;
implementation
{$R *.dfm}
{ TTestThread }
procedure TTestThread.Execute;
var
NewBitmap: TBitmap;
begin
while not Terminated do
begin
NewBitmap := TBitmap.Create;
try
NewBitmap.SetSize(200, 200);
NewBitmap.Canvas.MoveTo(Random(200), Random(200));
NewBitmap.Canvas.LineTo(Random(200), Random(200));
System.TMonitor.Enter(frmThreadDemo.FExampleBitmap);
try
frmThreadDemo.FExampleBitmap.ReleaseHandle;
frmThreadDemo.FExampleBitmap.Handle := NewBitmap.ReleaseHandle;
finally
System.TMonitor.Exit(frmThreadDemo.FExampleBitmap);
end;
TThread.Synchronize(nil, procedure
begin
frmThreadDemo.Invalidate;
end);
finally
NewBitmap.Free;
end;
Sleep(10);
end;
end;
procedure TfrmThreadDemo.FormDestroy(Sender: TObject);
begin
FTestThread.Free;
FExampleBitmap.Free;
end;
procedure TfrmThreadDemo.FormCreate(Sender: TObject);
begin
FExampleBitmap := TBitmap.Create;
FTestThread := TTestThread.Create;
end;
procedure TfrmThreadDemo.FormPaint(Sender: TObject);
begin
System.TMonitor.Enter(frmThreadDemo.FExampleBitmap);
try
Canvas.Draw(0, 0, FExampleBitmap);
finally
System.TMonitor.Exit(frmThreadDemo.FExampleBitmap);
end;
end;
Das komplette Projekt liegt auch im Anhang.