Hast du denn die Antworten und vor allen Kommentare gelesen und verstanden?
Was sind deine Schlüsse und Maßnahmen daraus?
Debuggst du mit Debug-DCUs?
So dass du im Falle von object locked error einfach mal auf Break klicken kannst und anhand des Callstacks siehst, wer oder was unberechtigterweise auf das gelockte TMonitor-Objekt zugreift?
Hast du dir mal die Threads ausgeloggt, die darauf zugreifen?
Ich nehme mal an, du bist unter Linux?
Unter Windows würde ich jetzt ganz simpel in die erste Zeile von DoPaintTest sowas schreiben
OutputDebugString(PChar(TThread.Current.ThreadID.ToHexString));
Da musst du dir mal das Gegenstück für Linux suchen.
Ansonsten ist dein Code halt suboptimal, probiere es doch mal so:
Delphi-Quellcode:
procedure TPaintLayout2.DoPaintTest(var PaintBMP: TBitmap);
var
p1, p2: TPointF;
i, j: Integer;
Brush: TStrokeBrush;
begin
PaintBMP.Width := 1000;
PaintBMP.Height := 1000;
Brush := TStrokeBrush.Create(TBrushKind.Solid, randomColor);
try
Brush.Thickness := 2;
p1 := TPointF.Create(2, 2);
if PaintBMP.Canvas.BeginScene then
begin
for i := 1 to 100 do
begin
Brush.Color := randomColor;
p2 := TPointF.Create(Random(400), Random(400));
PaintBMP.Canvas.DrawLine(p1, p2, 1, Brush);
end;
PaintBMP.Canvas.EndScene;
end;
finally
Brush.Free;
end;
end;