gpt4 book ai didi

delphi - 线程可以安全地创建FMX.Graphics.TBitmap.Canvas吗?

转载 作者:行者123 更新时间:2023-12-03 00:20:10 28 4
gpt4 key购买 nike

我正在维护一个使用 FMX.Graphics.TBitmap 的 Delphi 10.2.3 Isapi 应用程序。多个线程正在创建自己的私有(private)位图,在其上绘制,将二进制内容返回到 Web 请求处理程序,并释放位图。当调试此堆栈跟踪中发生访问冲突时:

:760c4742 KERNELBASE.RaiseException + 0x62
System.DynArraySetLength(nil,$407163,16,$F)
System.DynArraySetLength($6113648,$5DDE84,1,$6B6FE78)
System.Generics.Collections.TListHelper.InternalSetCapacity(8514146)
System.Generics.Collections.TListHelper.InternalGrow(???)
System.Generics.Collections.TListHelper.InternalGrowCheck(???)
System.Generics.Collections.TListHelper.InternalAddManaged((no value))
System.Messaging.TMessageManager.SubscribeToMessage(???,(FMX.Canvas.D2D.TCanvasD2D.ContextLostHandler,$6122F70))
FMX.Canvas.D2D.TCanvasD2D.CreateFromBitmap(???,SystemDefault)
FMX.Graphics.TBitmap.GetCanvas
Unit1.TWorker.Execute

我怀疑FMX框架代码中的这段代码不是线程安全的:

// FMX.Canvas.D2D.pas:
constructor TCanvasD2D.CreateFromBitmap(const ABitmap: TBitmap; const AQuality: TCanvasQuality);
begin
inherited;
FLastBrushTransform := TMatrix.Identity;
CreateResources;
FContextLostId := TMessageManager.DefaultManager.SubscribeToMessage(TContextLostMessage, ContextLostHandler);
end;

它正在调用单例 TMessageManager.DefaultManager 并将处理程序添加到其内部字典中,没有任何锁定。这看起来不太线程安全。根据文档,当使用 BeginScene 和 EndScene 时,FMX 位图可以在线程中使用,这很好。但实际上创建/销毁 FMX Canvas 似乎不是线程安全的,因为订阅/取消订阅单例默认 MessageManager?这个假设正确吗?

奇怪的是,当任何代码通过断点在调试器中的某个位置暂停并恢复时,它可能只会引发访问冲突。当程序从未被断点暂停时,它将毫无问题地运行。

最佳答案

我向您确认 FMX.Graphics.TBitmap.Canvas 中的代码不是线程安全的。只需看一下它,您就会发现它正在监听消息,并且消息传递不是线程安全的

constructor TD2DBitmapHandle.Create(const AWidth, AHeight: Integer; const AAccess: TMapAccess);
begin
inherited Create;
FWidth := AWidth;
FHeight := AHeight;
FAccess := AAccess;
FContextLostId := TMessageManager.DefaultManager.SubscribeToMessage(TContextLostMessage, ContextLostHandler);
end;

关于delphi - 线程可以安全地创建FMX.Graphics.TBitmap.Canvas吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58435930/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com