gpt4 book ai didi

android - Delphi Firemonkey TControl.MakeScreenshot 可以在线程中工作吗?

转载 作者:行者123 更新时间:2023-11-29 20:14:18 25 4
gpt4 key购买 nike

我创建了一个简单的 FireMonkey 屏幕截图捕获,它在 Android 和 Windows 上运行良好..:

procedure Capture;
var
B : TBitmap;
begin
try
B := Layout1.MakeScreenshot;
try
B.SaveToFile( ..somefilepath.png );
finally
B.Free;
end;
except
on E:Exception do
ShowMessage( E.Message );
end;
end;

结束;

当我将它移动到如下线程时,它在 Windows 中运行良好,但在 Android 中,我从调用 MakeScreenshot 时得到异常“位图太大”。在线程中使用 MakeScreenshot 是否需要额外的步骤?

procedure ScreenCaptureUsingThread;
begin
TThread.CreateAnonymousThread(
procedure ()
var
B : TBitmap;
begin
try
B := Layout1.MakeScreenshot;
try
B.SaveToFile( '...somefilepath.png' );
finally
B.Free;
end;
except
on E:Exception do
TThread.Synchronize( nil,
procedure ()
begin
ShowMessage( E.Message );
end );
end).Start;
end;

稍后补充。根据 Sir Rufo 和 Sebastian Z 的建议,这解决了问题并允许使用线程:

procedure Capture;
begin
TThread.CreateAnonymousThread(
procedure ()
var
S : string;
B : TBitmap;
begin
try
// Make a file name and path for the screen shot
S := '...SomePathAndFilename.png';
try
// Take the screenshot
TThread.Synchronize( nil,
procedure ()
begin
B := Layout1.MakeScreenshot;
// Show an animation to indicate success
SomeAnimation.Start;
end );

B.SaveToFile( S );
finally
B.Free;
end;
except
on E:Exception do
begin
TThread.Synchronize( nil,
procedure ()
begin
ShowMessage( E.Message );
end );
end;
end;
end).Start;
end;

最佳答案

MakeScreenShot 不是线程安全的,因此您不能在线程中安全地使用它。如果这在 Windows 中有效,那么我会说你很幸运。我建议您在线程外截取屏幕截图,只使用线程将屏幕截图保存为 png。绘画应该很快,而编码为 png 需要更多资源。因此,您仍然应该从该线程中获益良多。

关于android - Delphi Firemonkey TControl.MakeScreenshot 可以在线程中工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34238992/

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