这是我的第一个问题,很高兴找到这个网站.
我的问题涉及Delphi 2009中的新Generics功能.基本上我试图为现有的哈希映射实现编写一个通用的包装类.现有的实现存储(String,Pointer)对,所以在包装类中我必须在泛型参数类型T和指针类型之间进行转换,反之亦然.
type THashMap <T : class> = class
private
FHashList : THashList;
...
end;
Run Code Online (Sandbox Code Playgroud)
我想到了这样的演员(价值:T)
Value := (TObject (Ptr)) as T
Run Code Online (Sandbox Code Playgroud)
但这不起作用.编译器告诉我'运算符不适用于此操作数类型'.
有人有一些提示吗?非常感谢提前.
另一个同步问题......我希望你们不要生气;)
假设以下场景:一个中央数据结构(非常大,所以我真的不想让它变得不可变并且每当发生更改时都会复制它.我甚至不想在内存中保留多个副本),多个读取器线程访问该数据结构只读和一个编写器线程,使数据结构在后台保持最新.
我目前同步所有对数据结构的访问,这很好地工作(没有同步效果,没有死锁).我不喜欢这种方法的是,大多数时候我有很多读者线程处于活动状态,编写器线程只是偶尔活跃.现在,读者线程完全没有必要等待其他读者线程完成.只要编写器线程当前没有写入,他们就可以轻松地并行访问数据结构.
有没有一种漂亮而优雅的方式来解决这种情况?
编辑:非常感谢您的答案和链接!让我添加另一个简短且相关的问题:如果在读者的关键部分中执行的代码只需要很短的时间(就像只是哈希表查找),是否值得考虑实现您描述的技术之一或者是序列化在这种情况下锁的效果不是那么糟糕?可伸缩性和性能非常重要.你怎么看?
编辑2:我刚看了一个单个writer/mulitple reader的实现 - 锁定,这个实现使用监视器来同步WaitToRead方法中的一些代码.这不会导致我想要首先避免的相同序列化效果吗?(仍假设要同步的代码短而快)
在将给定的基于指针的有效哈希映射实现转换为通用哈希映射实现的过程中,我偶然发现了以下问题:
我有一个表示哈希节点的类(哈希映射实现使用二叉树)
THashNode <KEY_TYPE, VALUE_TYPE> = class
public
Key : KEY_TYPE;
Value : VALUE_TYPE;
Left : THashNode <KEY_TYPE, VALUE_TYPE>;
Right : THashNode <KEY_TYPE, VALUE_TYPE>;
end;
Run Code Online (Sandbox Code Playgroud)
除此之外,还有一个函数应返回指向哈希节点的指针.我想写
PHashNode = ^THashNode <KEY_TYPE, VALUE_TYPE>
Run Code Online (Sandbox Code Playgroud)
但那不会编译(';'预期,但'<'找到).
如何指向泛型类型的指针?
并向Barry Kelly致敬:如果您读到这个:是的,这是基于您的哈希映射实现.你自己没有写过这样一个通用版本的实现,对吗?那会节省我一些时间:)
我怎样才能实现这样的同步结构:
Lock.BeginRead
try
if Changed then
begin
Lock.BeginWrite;
try
Update;
finally
Lock.EndWrite;
end;
// ... do some other stuff ...
end;
finally
Lock.EndRead;
end;
Run Code Online (Sandbox Code Playgroud)
在EndWrite之后不会丢失读锁定,这样在执行此代码块时就不会执行其他编写器.
在这种情况下,Delphi 2009的TMuliReadExclusiveWriteSynchronizer如何表现?
我想基于后台线程实现可中断的任务.实现该TTask.Stop方法的最简洁方法是什么?我怎样才能中止后台线程?
在线程上下文中执行的代码使用匿名方法传递给任务,并且可以包含阻塞调用,因此我不能依赖于Terminated从代码中定期检查标志的事实.
感谢您的任何意见.
在重要的情况下使用D2010(某些事情TThread似乎已经改变)
这个问题是关于在长时间运行的任务期间保持GUI响应(在大多数情况下几秒钟).
我广泛使用线程和任务模式在后台线程中执行昂贵的任务.但是GUI更新需要一些时间呢?例如,填充大字符串网格或树视图?一个线程在这里没有帮助,因为无论如何一切都需要与主线程同步.
我知道这些问题Application.ProcessMessages,但目前它似乎是将调用ProcessMessages放入GUI更新方法的唯一解决方案.
有更好的想法吗?
我刚刚在文档中发现FloatToStr并且DateToStr在它们的单参数重载中不是线程安全的.原因是他们访问存储在全局变量中的本地化信息.
我的问题是:如果我不在运行时更改格式设置,这是否具有实际意义?据我了解,只要每个人都只读取格式设置 - 即使是多个线程,我也是安全的.
这是真的还是我错过了什么?
谢谢.
在我的一个应用程序中,我观察到越来越多的句柄.在不使用应用程序的情况下,该数字大约每秒递增一次,因此后台处理代码的某些部分必须存在句柄泄漏.
我该如何追踪这些泄漏?有没有工具可以帮助解决这个问题?跟踪句柄泄漏时要查找的模式是什么?导致手柄泄漏的最常见错误是什么?
一堆问题,但我希望它们足以将它们放在一个问题中.感谢提前输入!
我想将对象A传递给第二个对象B,让B做一些处理,最后释放A以防不再需要它.下面给出了一个淡化版本.
program Project6;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TMyObject = class(TObject)
public
FField1: string;
FField2: string;
end;
TBigObject = class(TObject)
public
FMyObject: TMyObject;
procedure Bind(var MyObject: TMyObject);
procedure Free();
end;
procedure TBigObject.Bind(var MyObject: TMyObject);
begin
FMyObject := MyObject;
end;
procedure TBigObject.Free;
begin
FreeAndNil(FMyObject);
Destroy();
end;
var
MyObject: TMyObject;
BigObject: TBigObject;
begin
try
MyObject := TMyObject.Create();
BigObject := TBigObject.Create();
BigObject.Bind(MyObject);
BigObject.Free();
if (Assigned(MyObject)) then begin
WriteLn('Set MyObject free!');
MyObject.Free();
end;
ReadLn;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end; …Run Code Online (Sandbox Code Playgroud) 我有一份注册表和一份登录表.登录表单(我的)Firefox默认提供用户名和密码,这没关系.但是在注册表上它也是一样的 - 这没有任何意义,它会产生问题,因为输入密码字段而"重复密码"字段不是.
有没有办法可以更改注册表单的HTML,以便Firefox和其他浏览器不会自动填写特定的密码字段?
编辑:我在这个主题上发现了很多问题(和答案),但是建议的解决方案(autocomplete=off在密码输入字段上设置)对我来说在Firefox上不起作用(它仍然自动填充字段).我找到了这个解决方案,但它看起来有点难看(如果用户输入用户名并点击Tab,则不起作用).有谁知道更好的方法?