lørdag, januar 23, 2021

C# – Listview – out of memory

Daily Rush Debat Programmering C# – Listview – out of memory

  • Forfatter
    Emne
  • #0

    mifan
    Bruger
    6.679 indlæg
    Offline

    Jeg arbejder med et værktøj, hvor jeg fylder et listview med billeder / store ikoner.
    Jeg scanner en cd for billeder, gør dem til thumbnails og fylder listview med disse via en imagelist.

    Det fungerer rigtig godt, så længe der kun er tale om nogle hundrede billeder.

    Desværre har jeg behov for, at runde flere tusinde billeder, og så går det lidt galt med memory.

    Er der et godt råd?

    Jeg leder evt. efter en metode til kun at rendere de thumbnails der er synlige, så de bliver vist efterhånden som jeg scroller i mit listview?

    ...powered by Google

Viser 10 kommentarer - 1 til 10 (af 10 i alt)
  • Forfatter
    Kommentarer
  • #1

    Munter
    Bruger
    2.473 indlæg
    Offline

    Hvad med at frigøre hukommelsen for de billeder som du allerede har bearbejdet?

    "Everybody wants to laugh but nobody wants to cry, Everybody wants to go to heaven... but nobody wants to die!"--Larry Howard

    #2

    Ni
    Bruger
    1.070 indlæg
    Offline

    Eller lav dit listview om til noget andet? At navigere i 1000-vis af billeder i et listview er ikke just fedt.

    #3

    Holger-IST-
    Bruger
    6.970 indlæg
    Offline

    Jeg tor også du er nødt til at lave en form for paging, der kun henter og har noget af dataen i hukommelsen. eller måske gemme thumbnails i en temp folder og hente dem efter behov

    - Holger "A woman drove me to drink and I didn't even have the decency to thank her." - W. C. Fields

    #4

    mifan
    Bruger
    6.679 indlæg
    Offline

    Jeg har i virkeligheden tre listviews, fordi billederne deles op i forskellige kategorier efterhånden som cd’en scannes igennem.

    Jeg har tidligere lavet dem sådan, at der kun blev vist nogle få billeder pr. listview, og så kunne man browse igennem fx. 20 sider med 20 billeder på hver.

    Jeg fik dog feedback på, at folk ønskede et enkelt vindue med alle billederne i.

    ...powered by Google

    #5

    Munter
    Bruger
    2.473 indlæg
    Offline

    Uden at se din kode kan vi ikke gøre meget.
    Jeg er helt sikker på at du kan gøre det her med en simpel refaktorering som frigør hukommelsen tidligere end når alle billeder er bearbejdet.

    "Everybody wants to laugh but nobody wants to cry, Everybody wants to go to heaven... but nobody wants to die!"--Larry Howard

    #6

    gulbaek
    Bruger
    142 indlæg
    Offline

    mifan har du evt. prøvet at kigge på en Backgroundworker.

    Du nøjes med at hente de thumbnails der er synlige. Når brugeren så scroller sætter du Backgroundworkeren igang med at hente flere thumbnails ind.

    #7

    mifan
    Bruger
    6.679 indlæg
    Offline

    #5

    Dette kode køres for hvert billede på cd’en, og tilføjer thumbnail til Imagelisten DTIconsNew:

    Image.GetThumbnailImageAbort hashCallBack = new Image.GetThumbnailImageAbort(ThumbnailCallBack);
    Image icon;

    try
    {
    icon = new Bitmap(file.FullName);
    }
    catch
    {
    icon = new Bitmap(Application.StartupPath + “\\Icons\\Private-128×128.png”);
    }

    Image thumbnail = icon.GetThumbnailImage(120, 120, hashCallBack, IntPtr.Zero);
    iconListNew.Images.Add(thumbnail);

    DataRow row = DTIconsNew.NewRow();
    row[“idN”] = fileCount;
    row[“nameN”] = file.FullName;
    DTIconsNew.Rows.Add(row);

    Derefter tilføjer jeg det hele til mit listview:

    LVnewImages.Clear();
    LVnewImages.View = View.LargeIcon;
    LVnewImages.CheckBoxes = true;
    LVnewImages.LargeImageList = iconListNew;
    iconListNew.ColorDepth = ColorDepth.Depth32Bit;
    iconListNew.ImageSize = new Size(120, 120);

    for (int i = 0; i < = iconListNew.Images.Count; i++) { try { ListViewItem itmp = new ListViewItem(Convert.ToString(DTIconsNew.Rows[i]["nameN"]), i); itmp.Checked = false; LVnewImages.Items.Add(itmp); } catch { } }

    ...powered by Google

    #8

    mifan
    Bruger
    6.679 indlæg
    Offline

    #6 Det er præcis noget i den stil jeg vil hen til, men er helt blank med, hvordan man kun viser de synlige thumbnails.

    Jeg bruger allerede backgroundworkers andre steder i programmet, og det kunne absolut være en løsning her. Men er som sagt lidt blank…

    ...powered by Google

    #9

    gulbaek
    Bruger
    142 indlæg
    Offline

    #8
    Tror Virtualmode gør lige præcist det du leder efter.

    http://msdn2.microsoft.com/da-dk/library/system.windows.forms.listview.virtualmode(en-us).aspx

    #10

    mifan
    Bruger
    6.679 indlæg
    Offline

    #9 Takker

    Det var præcis det jeg ledte efter.

    ...powered by Google

Viser 10 kommentarer - 1 til 10 (af 10 i alt)
  • Du skal være logget ind for at kommentere på dette indlæg.