XE5 Android TBitmap.LoadFromStream 在线程内失败

2023-12-11

我正在使用 Delphi XE5 创建一个简单的 Android 游戏。我有一些资源,PNG 和 Jpeg,我想在我的程序加载所有资源时显示加载屏幕。

但我发现将 TBitmap.LoadFromFile 或 TBitmap.LoadFromStream 代码放入 android 线程中,会导致应用程序立即退出并返回到启动器,在调试模式下 Delphi 甚至不会捕获异常。 (该代码在Windows上完美运行,在Android上没有线程)

我必须打开 logcat 看看发生了什么,我看到类似“创建绘图上下文时出错”的内容。

我的问题是有没有办法使用 Delphi XE5 为 Android 制作加载屏幕?这样当图像加载到内存中时就会显示进度屏幕。


我创建测试项目只是为了隔离问题,这是结果。 LoadFromFile 是线程 1。日志表明线程实际运行,但之后引发异常???

Logcat screenshot: Logcat Result Source code: http://www.pockhero.com/wp-content/uploads/2013/10/threadtest1.7z


这显然是一个错误,应该在下次更新中修复。要将修复应用到您的代码,请声明以下过程:

uses
  Androidapi.NativeActivity,
  Posix.Pthread;


procedure MyEndThreadProc(ExitCode:Integer);
var
  PActivity: PANativeActivity;
begin
    PActivity := PANativeActivity(System.DelphiActivity);
    PActivity^.vm^.DetachCurrentThread(PActivity^.vm);
    pthread_exit(ExitCode);
end;

并将其从 System.Classes 分配给 EndThreadProc:

procedure TForm1.FormCreate(Sender: TObject);
begin
  EndThreadProc := MyEndThreadProc;
end;

通过此修复,您可以设置,例如,您的线程

FreeOnTerminate := true;

然后这样的代码将不会再使应用程序崩溃:

TYourThread.Create(something, somethingelse).Start;

我必须感谢 Antonio Tortosa 在 Embarcadero 论坛上发布了这个解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XE5 Android TBitmap.LoadFromStream 在线程内失败 的相关文章

随机推荐