小编Eri*_*ric的帖子

ARC(iOS)下的Delphi TThread尚未发布

在ARC管理下使用Delphi for iOS终止线程的正确方法是什么?

举个简单的例子:

  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  public
    destructor Destroy; override;
  end;

  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    FThread: TMyThread;
  public
  end;

{ TMyThread }
destructor TMyThread.Destroy;
begin

  ShowMessage('Destroy');

  inherited Destroy;

end;

procedure TMyThread.Execute;
begin

  Sleep(5000);

end;

{ TForm2 }
procedure TForm2.Button1Click(Sender: TObject);
begin
  FThread := TMyThread.Create(TRUE);
  FThread.FreeOnTerminate := TRUE;
  FThread.Start;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  ShowMessage(FThread.RefCount.ToString);
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  FThread …
Run Code Online (Sandbox Code Playgroud)

delphi ios automatic-ref-counting delphi-xe4

13
推荐指数
1
解决办法
1195
查看次数

Delphi XE2 RTTI坏了吗?

我最近从D2010迁移到了DXE2,并在XE2和XE3(在我的朋友XE3中测试)中发现了与类内TBytes字段的RTTI生成相关的showstopper bug(或功能?).

我发现从不生成类中TBytes变量的RTTI信息.

以下代码在D2010中运行良好,但在XE2/XE3中显示消息"Error"

有没有人有任何线索?这将彻底打破我们所有的软件数据序列化实现

要测试代码,请将Rtti单位添加到使用声明中

type

  TMyClass = class
  public
    Field1: Integer;
    Field2: TBytes;
  end;


procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  Data: TMyClass;
  Rtti: TRttiContext;
  RttiClassType: TRttiInstanceType;
begin

  Data := TMyClass.Create;
  try

    // Get the context
    Rtti := TRttiContext.Create;
    try

      // Get the type for the class
      RttiClassType := TRttiInstanceType(Rtti.GetType(Data.ClassInfo));

      // Check the fields
      for i := 0 to High(RttiClassType.GetFields) do
      begin

        // Check the field type
        if not Assigned(RttiClassType.GetFields[i].FieldType) then
          ShowMessage('Error');

      end;

    finally
      Rtti.Free;
    end;

  finally
    Data.Free;
  end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 delphi-xe2 delphi-xe3

12
推荐指数
2
解决办法
1270
查看次数

Move上的浮点运算无效?

我遇到了一个我以前从未见过的奇怪问题,在Delphi 2010中有时使用例程CopyMemory(内部调用Move)我得到一个Invalid Float Point Operation异常,当使用Move时会发生这种情况?

我在汇编程序中有一个调试信息,我检查了Move的源代码,问题发生在FILD指令中,我发现FILD将一个整数值从内存转换为寄存器中的浮点,它可能触发无效操作,但为什么那个会发生?我现在坚持了2天

Assembler Information:
; System.Move (Line=0 - Offset=1)
;
00404E0C cmp eax, edx
00404E0E jz System.Move
00404E10 cmp ecx, +$20
00404E13 jnbe System.Move
00404E15 sub ecx, +$08
00404E18 jnle System.Move
00404E1A jmp dword ptr [System.Move+ecx*4]
00404E21 fild qword ptr [ecx+eax]
00404E24 fild qword ptr [eax] ; <-- EXCEPTION
00404E26 cmp ecx, +$08
00404E29 jle System.Move
00404E2B fild qword ptr [eax+$08]
00404E2E cmp ecx, +$10
00404E31 jle System.Move
00404E33 fild qword ptr [eax+$10]
00404E36 fistp qword …
Run Code Online (Sandbox Code Playgroud)

delphi assembly

1
推荐指数
1
解决办法
1126
查看次数