Hej, Någon skillnad om du listar med/utan ikoner? Annat visningsläge? Det är inte så att ListViewen egentligen skapar om en statisk array varje gång man lägger till nåt? (lr efter en viss bufferlängd) Vad händer om du kommenterar bort "add"-raderna (inte addrange alltså)? Thomas: Det har jag väl kommit ifrån isåfall genom att använda AddRange()? Fundering: När den är klar, var stannar koden om du pausar? (Kolla alla trådarna) Är inte säker på att jag förstår vad du menar. Funktionen körs just nu inte på en egen tråd eftersom det visade sig gå långsammare då. Kommenterar jag bort AddRange() så går CPU-användningen inte upp, så det måste vara där felet ligger. Har tittat lite på addrange-funktionen och den är lite skum, testa vad som händer om du loopar in rubbet istället och kör med vanliga add-metoden Det tar flera minuter att lägga till dom istället för ~5 sekunder med AddRange och CPU-användningen går inte upp. Ja, men det blev ingen skillnad när jag inaktiverade den. Bytte du den här raden: listViewFiles.Items.AddRange((ListViewItem[])myRecursiveItems.ToArray(typeof(ListViewItem))); Testa att stänga av lite kolumner och se ifall det ger någon skillnad. » Testa att stänga av lite kolumner och se ifall det ger någon skillnad. Nu hittade jag det! Vad händer om du slår av/på teman? » Vad händer om du slår av/på teman? I test-projekten lägger jag till en massa listviewitems i arraylisten, jag använder alltså inte den rekursiva funktionen där eftersom det inte var där det var fel. Och sen använder jag AddRange på samma sätt. Nu snackar du om att pausa igen... hur gör man det? När du debuggar, tryck på den knapp som ser ut som en paus-knapp (||) i verktygsfältet. Om den inte finns där, leta i debug-menyn Okej, den verkar stanna i slutet av Main-metoden. Antar att det är du som skrivit frågan på Expert Exchange också? Där finns lösningen iaf: Nej, det är inte jag, och jag tror inte att det är samma problem. Mitt problem handlar inte längre om den rekursiva funktionen som jag trodde, utan något som händer efter att alla items lagts till. Såhär ser mitt problem ut: <b>extremt många gånger (ca 10^50)</b> <b>Extremt var ordet. Du menar alltså att du väntade si så där 10^30 år på att det skulle bli klart?</b> Utan att använda några som helst regler så får du 9^81 lösningar, c:a 10^77.Rekursiv funktion och CPU-användning
För ett tag sedan, nästan ett halvår, så startade jag en tråd om en rekursiv funktion som var väldigt seg (http://www.pellesoft.se/communicate/forum/view.aspx?msgid=189844).
Den funktionen har jag nu gjort om lite och den är väldigt snabb, men nu är problemet att efter den har listat allting i en ListView, så går CPU-användnigen upp och stannar där.
Hur mycket CPU programmet tar tycks bero på hur många items man har i listan. Om jag har ~1800 items så tar programmet ca 40-50% av CPU:n och >3000 så är det uppe i 90-99%.
Är det något fel på min funktion eller har någon en aning om vad det är som orsakar detta?
<code>
public void GetFilesAndDirectoriesRecursive(string myParentDirectory, ListView myListView)
{
SetStatus(myParentDirectory);
#region Get Files
string[] myFiles = Directory.GetFiles(myParentDirectory);
for(int j = 0; j < myFiles.Length; j++)
{
if(myStopRecursiveScan) return;
if((File.GetAttributes(myFiles[j]) & FileAttributes.System) != FileAttributes.System)
{
if(FilterFile(Path.GetFileName(myFiles[j]), textBoxFilter.Text, checkBoxMatchCase.Checked, checkBoxRegExp.Checked))
{
ListViewItem myItem = new ListViewItem(myFiles[j].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""), 1);
myItem.SubItems.Add(myFiles[j].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""));
myItem.SubItems.Add("No Change");
myItem.SubItems.Add(ConvertBytes(new FileInfo(myFiles[j]).Length));
myItem.SubItems.Add(Path.GetExtension(myFiles[j]).Replace(".", "").ToUpper());
myItem.SubItems.Add(File.GetCreationTime(myFiles[j]).ToShortDateString());
myItem.SubItems.Add(File.GetLastWriteTime(myFiles[j]).ToShortDateString());
myItem.SubItems.Add(File.GetLastAccessTime(myFiles[j]).ToShortDateString());
myItem.Tag = myFiles[j];
// myRecursiveItems är en ArrayList
myRecursiveItems.Add(myItem);
progressBar.Value++;
}
}
}
#endregion
#region Get Directories
string[] myDirectories = Directory.GetDirectories(myParentDirectory);
for(int i = 0; i < myDirectories.Length; i++)
{
if(myStopRecursiveScan) return;
if((File.GetAttributes(myDirectories[i]) & FileAttributes.System) != FileAttributes.System)
{
if(FilterDirectory(Path.GetDirectoryName(myDirectories[i]), textBoxFilter.Text, checkBoxMatchCase.Checked, checkBoxRegExp.Checked))
{
ListViewItem myItem = new ListViewItem(myDirectories[i].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""), 0);
myItem.SubItems.Add(myDirectories[i].Replace(treeViewDirectories.SelectedNode.Tag.ToString() + "\\", ""));
myItem.SubItems.Add("No Change");
myItem.SubItems.Add("0 B");
myItem.SubItems.Add("<DIR>");
myItem.SubItems.Add(Directory.GetCreationTime(myDirectories[i]).ToShortDateString());
myItem.SubItems.Add(Directory.GetLastWriteTime(myDirectories[i]).ToShortDateString());
myItem.SubItems.Add(Directory.GetLastAccessTime(myDirectories[i]).ToShortDateString());
myItem.Tag = myDirectories[i];
myRecursiveItems.Add(myItem);
progressBar.Value++;
}
}
Application.DoEvents();
GetFilesAndDirectoriesRecursive(myDirectories[i], myListView);
}
#endregion
}
</code>
Jag lägger sedan till filerna och mapparna med
<code>
SetStatus("Filling... (" + myRecursiveItems.Count + " Files And/Or Folders)");
listViewFiles.BeginUpdate();
listViewFiles.Items.Clear();
listViewFiles.Items.AddRange((ListViewItem[])myRecursiveItems.ToArray(typeof(ListViewItem)));
listViewFiles.EndUpdate();
SetStatus("Ready");
</code>
/MickeSv: Rekursiv funktion och CPU-användning
Sv: Rekursiv funktion och CPU-användning
Sv:Rekursiv funktion och CPU-användning
Sv: Rekursiv funktion och CPU-användning
Oskar: Det går snabbare men CPU-användningen går inte ner.
/MickeSv:Rekursiv funktion och CPU-användning
Sv: Rekursiv funktion och CPU-användning
/MickeSv:Rekursiv funktion och CPU-användning
Sv: Rekursiv funktion och CPU-användning
/MickeSv: Rekursiv funktion och CPU-användning
/MickeSv:Rekursiv funktion och CPU-användning
Mot något i stil med?
foreach(ListViewItem lvi in myRecursiveItems)
{
this.listViewFiles.Items.Add(lvi);
}Sv:Rekursiv funktion och CPU-användning
(Tycker alltihopa bara låter suspekt... Känns som att det inte finns någon logik i det :P )Sv: Rekursiv funktion och CPU-användning
Har redan provat och det gör ingen skillnad.
» (Tycker alltihopa bara låter suspekt... Känns som att det inte finns någon logik i det :P )
Visst gör det, har sökt och sökt och sökt men inte hittat någon som har haft ett liknande problem.
Jag har testat med lite olika antal mappar och filer, och det verkar som om det uppstår när det finns fler än 500 items i listan. Då är CPU-användningen mellan 13-16%. Har även gjort två andra test-program i både VB.NET och C# och lagt till 30000 items utan problem.Sv:Rekursiv funktion och CPU-användning
Det verkar vara CheckBoxarna som visas bredvid som gör det. Men det är lite konstigt att samma sak inte uppstår i de nya projekten jag gjorde. Där lägger jag till 30000 items och CPU-användningen går inte upp ett dugg.
Några idéer? Vill ju gärna ha checkboxarna i listan...
/MickeSv: Rekursiv funktion och CPU-användning
(Finns det verkligen inte någon skillnad mellan ditt projekt och de fungerande testprojekten?)Sv:Rekursiv funktion och CPU-användning
Ingen skillnad.
» (Finns det verkligen inte någon skillnad mellan ditt projekt och de fungerande testprojekten?)
Det måste ju finnas någon skillnad, kan inte hitta den bara :)
Jag har provat med/utan ikoner, kolumner, manifest-fil, teman, progressbar, sortering och olika views.Sv:Rekursiv funktion och CPU-användning
De items jag lägger till i test-projekten innehåller ungefär lika mycket data som i det "riktiga" programmet.
/MickeSv:Rekursiv funktion och CPU-användning
/MickeSv: Rekursiv funktion och CPU-användning
Sv:Rekursiv funktion och CPU-användning
/MickeSv:Rekursiv funktion och CPU-användning
http://www.experts-exchange.com/Programming/Programming_Languages/Dot_Net/VB_DOT_NET/Q_21611070.html
Hade ett annat problem förut med en rekursiv funktion som skulle köras extremt många gånger (ca 10^50) och fick det aldrig att fungera. Vet inte om funktionspekarlistan eller vad som nu används av .Net för att hålla koll på var den är i exekveringen blev överfull men det fick inte så som jag skrivit det.. Slutade med att jag använde 'Goto' ;)
Men det borde inte vara några som helst problem i det här fallet iaf.
Mvh
PeterSv: Rekursiv funktion och CPU-användning
» Den rekursiva funktionen sätts igång med start i "Mina dokument" (ca 1800 filer och mappar)
» Alla filer och mappar ligger nu i en ArrayList och än har CPU-användningen inte gått upp
» ArrayList:en läggs till i ListView:n med AddRange()
» CPU-användningen går upp till ett visst antal procent beroende på hur många items som lagts till.
Nu har jag märkt att detta inte händer om jag väljer att inte visa "CheckBoxes" i ListView:n.
Men! Nu kommer det konstiga...
Om jag skapar ett nytt projekt och lägger till 30000 items i en ArrayList och använder AddRange på samma sätt, så går CPU-användningen inte upp även om jag har "CheckBoxes" aktiverat.
Oskar: Tack för dina idéer hittills!
/MickeSv: Rekursiv funktion och CPU-användning
Extremt var ordet. Du menar alltså att du väntade si så där 10^30 år på att det skulle bli klart?Sv:Rekursiv funktion och CPU-användning
Den gick aldrig så många gånger. Var en Sudoku-testare som försökte testa alla möjliga varianter helt utan "smart" logik eller regler tills den hittade en lösning. Den tog förresten ungefär 9 timmar att hitta en lösning när jag försökte på en (med goto eftersom rekursionen inte gick av någon anledning). :-)
9!^9 antal möjliga lösningar finns det vilket väl ungefär blir 10^50.
Mvh
PeterSv: Rekursiv funktion och CPU-användning
Du kanske räknar 9 tal fördelade per rad (9!) och 9 rader (^9). Ja, det stämmer ju i så fall.
Sannolikt kolar en rent rekursiv lösning ganska snabbt, minnesmässigt, så det verkar rimligt.