小编Gri*_*fyn的帖子

TRTTIContext多线程问题

我读过的所有内容都表明TRTTIContext是线程安全的.

但是,当多线程时,TRTTIContext.FindType似乎偶尔会失败(返回nil).在它周围使用TCriticalSection可以解决问题.请注意,我正在使用XE6,并且XE中似乎不存在该问题.编辑:似乎存在于所有具有新RTTI单元的Delphi版本中.

我已经编写了一个测试项目,你可以用来亲自看看.创建一个新的VCL项目,删除TMemo和TButton,用下面替换unit1,并分配Form1.OnCreate,Form1.OnDestroy和Button1.OnClick事件.密钥CS是TTestThread.Execute中的GRTTIBlock.目前已禁用,当我运行200个线程时,我得到3到5个失败.启用GRTTIBlock CS可以消除故障.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, SyncObjs, Contnrs, RTTI;

type
  TTestThread = class(TThread)
  private
    FFailed: Boolean;
    FRan: Boolean;
    FId: Integer;
  protected
    procedure Execute; override;
  public
    property Failed: Boolean read FFailed;
    property Ran: Boolean read FRan;
    property Id: Integer read FId write FId;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FThreadBlock: TCriticalSection;
    FMaxThreadCount: Integer;
    FThreadCount: Integer; …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading win64 rtti delphi-xe6

10
推荐指数
2
解决办法
1003
查看次数

如何在 Delphi 中使用 RTTI 将枚举转换为字符串并再次转换回来

我无法根据名称而不是序数值获取枚举类型。我需要在类属性的 RTTI 循环内执行此操作。我尝试过使用 GetEnumName 和 TRTTIEnumerationType.GetName,但我似乎无法从 TRTTIProperty 实例将这些东西组合在一起。

请帮助?(下面的框架代码示例)

    用途
      RTTI、类型信息;
    
    类型
      TCustomColor = (ccBlack, ccBrown, ccBlue);
    
      TMyClass = 类
      民众
        属性自定义颜色:TCustomColor;
      结尾;
    
    程序输出;
    变量
      rc:TRTTIContext;
      rt : TRTTI 类型;
      rp : TRTTI 属性;
      mc : TMyClass;
    开始
      mc.CustomColor := ccBlue;
      rt := rc.GetType(mc.ClassType);
      对于 rt.GetProperties 中的 rp 做
        如果 rp.PropertyType.TypeKind = tkEnumeration 那么
        开始
          // TODO: 从属性中检索“ccBlue”
        结尾;
    结尾;
    
    程序输入;
    变量
      n、s:字符串;
      o:T 对象;
      rc:TRTTIContext;
      rt : TRTTI 类型;
    开始
      n := '自定义颜色';
      s := 'ccBlue';
      // 注意:o 是从它的类类型的字符串实例化的 …

delphi enums rtti

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

标签 统计

delphi ×2

rtti ×2

delphi-xe6 ×1

enums ×1

multithreading ×1

win64 ×1