我使用Indy 10的TIdCmdTCPServer组件来实现我的客户端 - 服务器应用程序.问题是来自客户端的请求可能相当复杂,并且我的服务器应用程序的GUI部分立即失去响应能力.从Indy文档中,我得到了Indy:
使用线程优先级tpHighest为Bindings创建和启动侦听器线程.
我可以改变这种行为吗?
假设一个数据结构的人用于联系人数据库.结构的字段应该是可配置的,以便用户可以将用户定义的字段添加到结构中,甚至可以更改现有字段.所以基本上应该有一个配置文件
FieldNo FieldName DataType DefaultValue
0 Name String ""
1 Age Integer "0"
...
Run Code Online (Sandbox Code Playgroud)
然后程序应加载此文件,管理动态数据结构(动态不在"运行时更改"方式,但在"用户可以通过配置文件更改"方式)并允许轻松和类型安全地访问数据字段.
我已经实现了这一点,将有关每个数据字段的信息存储在静态数组中,并仅在对象中存储更改的值.
我的问题:有没有描述这种情况的模式?我想我不是第一个遇到创建用户可调类的问题的人吗?
提前致谢.如果问题不够明确,请告诉我.
我有问题要在以下场景中使用泛型:
Delphi提供的IComparable接口:
IComparable <T> = interface
function CompareTo (Value : T) : Integer;
end;
Run Code Online (Sandbox Code Playgroud)
我添加另一个接口IPersistent:
IPersistent = interface
function ToString : String;
procedure FromString (const Str : String);
end;
Run Code Online (Sandbox Code Playgroud)
实现两个接口的类的一个示例:
TComparableString = class (TInterfacedObject, IComparable <String>, IPersistent)
strict private
FValue : String;
public
function CompareTo (Value : String) : Integer;
function ToString : String;
procedure FromString (const Str : String);
end;
Run Code Online (Sandbox Code Playgroud)
现在为另一个具有两个接口约束的泛型类:
ISortIndex <VALUE_TYPE : IPersistent, IComparable> = interface
...
end;
Run Code Online (Sandbox Code Playgroud)
最后是该接口的一个实现:
TSimpleSortIndex <VALUE_TYPE : IPersistent, IComparable> = class (TInterfacedObject, …Run Code Online (Sandbox Code Playgroud) 如果我写
type
MyClass = class of TMyClass;
...
Obj := MyClass.Create;
Run Code Online (Sandbox Code Playgroud)
调用正确的构造函数(TMyClass中的构造函数).
如果我写
var
ClassVar : TClass;
...
ClassVar := TMyClass;
Obj := ClassVar.Create;
Run Code Online (Sandbox Code Playgroud)
只调用TObject构造函数.
为什么?这两个版本有什么区别?我可以在第二种情况下强制执行TMyClass构造函数调用吗?
我想创建一个不可见的控件(从TCustomControl派生)但对正常事件做出反应(我想用它来显示在自定义元素上移动鼠标时的提示).我认为重写paint方法并将其留空将完成这项工作但不幸的是在组件所在的位置绘制了一个矩形.
如何使控件完全不可见?
我目前正在考虑一个场景,我想要一个调用Free其项目的泛型类,如果它们是一个对象类型.所以我尝试了以下方法:
if (PTypeInfo (TypeInfo (T)).Kind = tkClass) then
begin
RttiType := RttiContext.GetType (TypeInfo (T));
FreeMethod := RttiType.GetMethod ('Free');
if (FreeMethod <> nil) then
FreeMethod.Invoke (FInstance, []);
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,最后一行没有编译,这并不奇怪,因为类型不匹配.问题是:我可以编译吗?我尝试了转换Pointer然后转到TObject但是这给了我一个无效的类型转换错误.有没有办法FInstance : T进入TObject我可以传递给的参考Invoke?
或者有没有其他方法来实现我想要的?请注意,重点是获取此类中的所有内容,因此我不想创建TObjectMyClass只接受对象的内容.
谢谢你的帮助.
我正在尝试捆绑到Delphi XE中的CodeSite Express.我想使用这样的Category功能:
CodeSite.Category := 'SomeCategory';
CodeSite.EnterMethod ('SomeMethod');
try
DoSomething;
finally
CodeSite.ExitMethod ('SomeMethod');
end;
Run Code Online (Sandbox Code Playgroud)
问题是,如果DoSomething包含设置类别的日志记录代码,那么结果ExitMethod将以不同的类别结束,并将在查看器中炸毁整个层次结构.
更糟糕的是,如果线程插入:设置Category然后调用日志命令显然不是原子操作,因此使用CodeSite日志记录的两个线程无法真正使用Category.至少这就是我在日志中的样子.我原本期望它Category是线程局部的,但似乎不是.
在嵌套日志记录和线程的上下文中处理类别的正确模式是什么?
谢谢!
FastMM报告以下代码片段的内存泄漏(UnicodeString),该代码片段使用带有字符串的记录线程变量:
program Project10;
{$APPTYPE CONSOLE}
{$R *.res}
uses
FastMM4,
System.SysUtils;
type
TContext = record
Value : String;
end;
threadvar
Context : TContext;
begin
Context.Value := 'asdfsdfasfdsa';
end.
Run Code Online (Sandbox Code Playgroud)
这是真正的内存泄漏还是在FastMM检查内存泄漏后才发生线程变量的清理?
更重要的是:我怎样才能抑制这些"内存泄漏",因为它们会混淆可能发现的任何其他内存泄漏?
什么是在Tstringlist中查找重复项的最快方法.我获得了在Stringlist中搜索重复项所需的数据.我目前的想法是这样的:
var TestStringList, DataStringList : TstringList;
for i := 0 to DataStringList.Items-1 do
begin
if TestStringList.Indexof(DataStringList[i])< 0 < 0 then
begin
TestStringList.Add(DataStringList[i])
end
else
begin
memo1.ines.add('duplicate item found');
end;
end;
....
Run Code Online (Sandbox Code Playgroud) 我有一个程序响应WM_QUERYENDSESSION执行一些清理作为计划任务运行.记录表明未执行清理代码.作为计划任务运行的应用程序是否接收WM_QUERYENDSESSION消息,或者是否有其他方法来检测Window关闭?
delphi ×10
delphi-2009 ×3
generics ×2
casting ×1
codesite ×1
controls ×1
delphi-2010 ×1
delphi-xe ×1
delphi-xe2 ×1
dynamic ×1
fastmm ×1
indy ×1
interface ×1
logging ×1
memory-leaks ×1
winapi ×1
windows ×1