Der Code wurde noch etwas erweitert ... jetzt kann man auch mal in den Stack/Queue reingucken, ohne das Item erst rausholen zu müssen,
aber zur Sicherheit muß dafür der Stack gesperrt werden.
Ich hoffe mal dieses funktioniert auch so, wie es geplant ist.
Zitat von
NamenLozer:
Habe leider kein Delphi 2007, aber interessant finde ich, dass du die Klasse von TCriticalSection abgeleitet hast. Das habe ich so bisher noch nicht gesehen.
Ist auch mein erstes Mal, daß ich überhaupt direkt TCriticalSection verwende.
Hab sonst immer direkt mit der
WinAPI gearbeitet.
Im Prinzip hätte ich auch ein Feld in meiner Klasse anlegen können und dann im Konstuktor/Destruktor die TCriticalSektion selber erstellen/freigeben können.
Aber da es eh keinen Vorfahren gibt, konnte ich von der CS ableiten, hab auch gleich ihre Funktionen geerbt und kann nun ihre Funktionen auch direkt verwenden (siehe Enter und Leave).
Ich geb's zu ... ich, bzw. meine Klasse ist stinkend faul,
aber es ist schon praktisch, wenn man sich z.B. so etwas Arbeit und Code spart.
Macht das Ganze gleich viel übersichtlicher.
Als reinen einfachen und dennoch threadsicheren Stack kommt man so mit nur 2 winzigkleinen Funktionen aus ...
den Rest übernimmt Delphi für einen.
Delphi-Quellcode:
Unit GenStack;
Interface
Uses SyncObjs;
Type TGenStack<Typ> =
Class(TCriticalSection)
Private
_List:
Array of Typ;
Public
Procedure Push (
Const X: Typ);
Function Pop (
Var X: Typ): Boolean;
End;
Implementation
Procedure TGenStack<Typ>.Push(
Const X: Typ);
Begin
Enter;
Try
SetLength(_List, Length(_List) + 1);
_List[High(_List)] := X;
Finally
Leave;
End;
End;
Function TGenStack<Typ>.Pop(
Var X: Typ): Boolean;
Begin
Enter;
Try
Result := Length(_List) > 0;
If Result
Then Begin
X := _List[High(_List)];
SetLength(_List, Length(_List) - 1);
End;
Finally
Leave;
End;
End;
End.
Joar, ist schon schade mit dem TD ... dabei sind die Generics 'ne ganz feine Sache
Hier z.B. ein Assiziatives Array, wie man es z.B. aus'm PHP kennt.
http://www.delphipraxis.net/internal...t.php?t=156343
Klar, man könnte es auch über eine Klasse lösen, aber so ist es genauso nutzbar, wie ein stinknormales dynamisches Array und man muß sich nicht um die Speicherverwaltung kümmern (.Create und .Free).