Код, взятый из этой ссылки , не замораживает комп. Но это работает только на ff.
/**
* Netscape compatible WaitForDelay function.
* You can use it as an alternative to Thread.Sleep() in any major programming language
* that support it while JavaScript it self doesn't have any built-in function to do such a thing.
* parameters:
* (Number) delay in millisecond
*/
function nsWaitForDelay(delay) {
/**
* Just uncomment this code if you're building an extention for Firefox.
* Since FF3, we'll have to ask for user permission to execute XPCOM objects.
*/
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
// Get the current thread.
var thread = Components.classes["@mozilla.org/thread-manager;1"].getService(Components.interfaces.nsIThreadManager).currentThread;
// Create an inner property to be used later as a notifier.
this.delayed = true;
/* Call JavaScript setTimeout function
* to execute this.delayed = false
* after it finish.
*/
setTimeout("this.delayed = false;", delay);
/**
* Keep looping until this.delayed = false
*/
while (this.delayed) {
/**
* This code will not freeze your browser as it's documented in here:
* https://developer.mozilla.org/en/Code_snippets/Threads#Waiting_for_a_background_task_to_complete
*/
thread.processNextEvent(true);
}
}
Для интерфейсов вы захотите использовать указатель PTypeInfo, который возвращается волшебной функцией компилятора TypeInfo. PTypeInfo объявляется в модуле TypInfo.
type
TInterfaceDictionary = TObjectDictionary<PTypeInfo, TObject>;
var
d: TInterfaceDictionary;
myObject: TSomeImplementation;
begin
d := TInterfaceDictionary.Create([doOwnsValues]);
d.Add(TypeInfo(ISomeInterface), TSomeImplementation.Create());
myObject = d[TypeInfo(ISomeInterface)];
end;
Конечно, если бы это были классы, а не интерфейсы, вы могли бы просто использовать ссылку TClass.
Если это на самом деле TInterfaceDictionary, вы можете написать его так:
type
TInterfaceDictionary = TObjectDictionary<TGUID, TObject>;
Очевидно, это требует GUID для каждого используемого интерфейса.
Из-за некоторой магии компилятора вы можете использовать его довольно просто:
d.Add(ISomeInterface, TSomeImplementation.Create());
(Мейсон: извините за взлом примера кода)