Forum Delphi.cz

Delphi => Obecné => Téma založeno: bluebat 24-02-2019, 18:26:41

Název: Nekonečný seznam
Přispěvatel: bluebat 24-02-2019, 18:26:41
Zdravím všechny, řeším situaci:

a) ve smyčce generuji objekty (např. co 50 ms) a potřebuji je ukládat do seznamu
b) nastává situace, že objekty pak musím likvidovat, ale stále přibývají nové
c) předpokládám, že objektů bude vždy 1000 - 5000

Jaké objekty na to v Delphi ideálně použít? Dá se něco rozumně, kde mohu iterovat mezi objekty a pracovat s nimi?

Pokud začnu s TDictionary<Integer, MujObjekt>, tak to ma nevýhody právě toho indexu (Integer) a hlavně budu muset řešit, jaký Key je volný a jaký ne atd. Určitě je na to efektivnější způsob, poradíte prosím?
Název: Re:Nekonečný seznam
Přispěvatel: raul 24-02-2019, 18:33:27
Na tohle bych jednoznacne pouzil linkedlist - klido rucne napsanej.

Pokud nevis tak : Mas polozku dejme tomu tData. K tomu pridas tNext (pripadne i tPrew treba atd) a zabalis dokupy do tItem. Cele to hodis do nejaky tridy ala tLinkedList s metodami Add, Remove, atd.

Funguje to tak, ze kazdda polozka ma info pouze o nasledujici polozce, tzn i pro multithread pristup je to velmi elegantni (protoze zamykas jen dany zaznam, ne cely list, tzn pro pridani jen posledni, pro smazani jen prvni ci nektery). Nevyhoda je, ze se samozrejme blbe zjistuje existence prvku, ale jako fronta je to nejrychlejsi. (Bezne to pouzivam napriklad pro logovani z aplikaci, kde SendToLog(string) jen prida neco do fronty a neni tedy brzdenej skutecnym zapisem (at uz na monitor ci do souboru). No a pak je vlakno, ktere udrzuje ten list prazdny (to fyzicky zapisuje).

Název: Re:Nekonečný seznam
Přispěvatel: pf1957 24-02-2019, 19:03:55
a) ve smyčce generuji objekty (např. co 50 ms) a potřebuji je ukládat do seznamu
b) nastává situace, že objekty pak musím likvidovat, ale stále přibývají nové
Z popisu mi neni jasne, proc objekty ukladas a co s nimi delas, nez je likvidujes. Bezne se na to pouziva fronta typu FIFO a Delphi ma genericke TQueue<T>, TObjectQueue<T> + nejaky helper k tomu.

Ja to treba zaboxoval do vlastni TThreadedQueue<T>, ke ktere ridim pristup pomoci System.TMonitor. A teprve kdybych mel vykonnostni problemy, tak bych uvazoval o nahrazeni implementace TQueue<T>
Název: Re:Nekonečný seznam
Přispěvatel: František 24-02-2019, 20:27:58
a co TObjectDictionary?
Název: Re:Nekonečný seznam
Přispěvatel: bluebat 25-02-2019, 11:30:02
Děkuji všem, zatím je to spíše "učení" z mé strany co a jak. takové ty projektíky, kdy chce člověk něco udělat a přitom se naučit...

Zvažoval jsem Frontu - jen mě zajímalo, zda nejsou nějaké zajímavé objekty co použít místo toho. A vzhledem k tomu, že stejně seznam prvků procházím iteracemi a nepotřebuji přímý přístup na prvky podle indexu, tak opravdu ta fronta bude v mém případě asi nejlepší.

Díky.