![]() |
AW: Record threadsicher verwenden
Zitat:
Delphi-Quellcode:
Oder du nutzt die Funktion FUserList.ForEach().
var
user: TUser; userID: TUserID; begin userID := 5; user.UserName := 'Klaus'; user.LoginCount := 3; FUserList.AddOrUpdate(userID, user); userID := 0; FUserList.FindKeyFromValue(user, userID); // userID = 5 Bis bald... Thomas |
AW: Record threadsicher verwenden
Zitat:
anstatt ein solches Array für JEDE Nachricht aus dem TSynDictionary neu aufzustellen. Im Grunde resultiert das zweite Problem aus dem ersten: Nutze ich das
Delphi-Quellcode:
dann ist es nicht threadsicher. Aber es ist "sofort" verfügbar.
var logged_users:THttpServerConnectionIDDynArray;
Wenn ich das Array für jede Nachricht aus dem TSynDictionary zusammen baue, fürchte ich eine hohe Systemlast. Und zusätzlich habe ich dann das folgende Problem: Die Nachricht darf nur an User versendet werden, dessen Name hinterlegt ist. Somit müsste ich das ganze TSynDictionary durchgehen und prüfen, ob da ein Username drin steht. Und wenn, dann brauche ich den Key dazu. Deswegen wird mir das nicht helfen:
Delphi-Quellcode:
Der User 'Klaus' aus dem Beispiel kann ja von verschiedenen Endgeräten eingeloggt sein. Er hat demnach verschiedene ID's.
FUserList.FindKeyFromValue(user, userID); // userID = 5
Mein erster Ansatz war:
Delphi-Quellcode:
FUserList.CopyValues(users);
for I := Low(users) to High(users) do if (users[i].UserName<>'') then //Alle eingeloggten User begin //Und hier komme ich nicht an die ID, da sie der KEY ist und ich keinen Bezug dazu habe end; |
AW: Record threadsicher verwenden
Ich antworte allgemein. Wenn du noch kein gutes Gefühl für die richtige Architektur hast, probiere zuerst die einfachste Lösung aus: "make it work, then make it fast".
TDynArray/TDynArrayHashed sind nur die "mächtige Verwaltung" eines array of x. Values und Keys in einem TSynDictionary sind TDynArray/TDynArrayHashed Arrays. Wenn du den Array-Index des Values hast, hast du auch den Array-Index des Keys. TSynDictionary ermöglicht den direkten Zugriff auf die Values. Count gibt den Füllstand zurück. Mit Values.ElemPtr(idx)^ greifst du zu. Und Threadsafe wird es mit einem Lock/UnLock um alles. Die Ausführungszeit dürfte sich im Bereich us Sekunden bewegen. Du kannst die benötigten IDs damit zusammensammeln. Wenn dich die genaue Zeit interessiert:
Delphi-Quellcode:
Bis bald...
var
Timer: TPrecisionTimer; begin Timer.Start; ... ShowMessage(Format('Total time: %s', [Timer.Stop])); end; Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz