我读过的所有内容都表明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) 我无法根据名称而不是序数值获取枚举类型。我需要在类属性的 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 是从它的类类型的字符串实例化的 …