Autor Téma: Nekonečný seznam  (Přečteno 309 krát)

Offline bluebat

  • Nováček
  • *
  • Příspěvků: 25
  • Karma: 5
    • Verze Delphi: 10.3 Rio
Nekonečný seznam
« kdy: 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?

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 243
  • Karma: 14
    • Verze Delphi: FPC :D
Re:Nekonečný seznam
« Odpověď #1 kdy: 24-02-2019, 18:33:27 »
Excellent
Rated 1 time
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).

Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2475
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Nekonečný seznam
« Odpověď #2 kdy: 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>

Offline František

  • Hrdina
  • ****
  • Příspěvků: 473
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Nekonečný seznam
« Odpověď #3 kdy: 24-02-2019, 20:27:58 »
a co TObjectDictionary?

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1712
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Nekonečný seznam
« Odpověď #4 kdy: 24-02-2019, 21:50:45 »
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).

Pro thread safe by mohly stacit i Interlocked Singly Linked Lists.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline bluebat

  • Nováček
  • *
  • Příspěvků: 25
  • Karma: 5
    • Verze Delphi: 10.3 Rio
Re:Nekonečný seznam
« Odpověď #5 kdy: 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.