Programm hat zu viel Speicherauslastung ... Lösung ?



  • Hallöchen,

    ich habe mir ein kleines Progrämmchen geschrieben welches jede Sekunde Daten aus einem ListCtrl in zwei verschiedene TXT-Dateien schreibt. Doch jetzt ist mein Problem, dass die Speicherauslastung (nach Taskmanager) (Milli)-sekündlich um 4 machmal sogar 10 steigt. Nach ca. 10 Min steht dann im Taskmanager ca 9.000 !!!

    Und da mein Programm eigentlich ca. 6 - 8 Stunden am Stück durchhalten sollte, und es nicht nach schon einer Stunde an Speicherauslastung sterben soll, frage ich hier nun nach einer anderen Lösung...

    Wüsste jemand was ... ?

    Thx a lot
    HiJacker



  • also entweder hast du irgendwo speicherlöscher produziert oder du hällst immer die kompletten dateien im speicher vor (was du wenn die riesengross sind nicht tun solltest)...



  • Hmm, das wäre möglich. Aber ich speichere meine Dateien ganz normal...Denke ich zumindest.. ^^

    Was ich außerdem noch mache (hab ich völlig vergessen zu erwähnen) ist, ich überprüfe sekündlich ob ein Haken einer Checkbox in dem ListCtrl gesetzt wurde, und wenn ja, dann setze ich ein anderes Icon in der Liste..

    Hier mal mein Code in der OnTimer :

    CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST1);
    
    	if(nIDEvent == SAVE)
    	{
    		CStdioFile file;
    		CStdioFile fileX;
    		if(file.Open("C:\\Windows\\system32\\X.txt", CFile::modeCreate | CFile::modeWrite ))
    		{
    			if(fileX.Open("C:\\Windows\\system32\\Y.txt", CFile::modeCreate | CFile::modeWrite ))
    			{
    				for( int i = 0; i < pList->GetItemCount(); i++ )
    				{
    					if(pList->GetCheck(i) == FALSE)
    					{
    						CString str = pList->GetItemText(i, NULL);
    						CString strText;				
    
    						strText.Format("\n%s", str);			
    						file.WriteString(strText);
    
    						LVITEM pItem; 
    						ZeroMemory(&pItem, sizeof(LVITEM)); 
    						pItem.mask = LVIF_IMAGE | LVIF_TEXT; 
    						pItem.iItem = i; 
    						pItem.iSubItem = 0; 
    						pItem.pszText = (LPTSTR)(LPCTSTR)(str); 
    						pItem.iImage = m_imageList.Add(hIcon[0]); 
    
    						pList->SetItem(&pItem);
    
    					}
    					else
    					{
    						CString str = pList->GetItemText(i, NULL);
    						CString strText;				
    
    						strText.Format("\n%s", str);			
    						fileX.WriteString(strText);						
    
    						LVITEM pItem; 
    						ZeroMemory(&pItem, sizeof(LVITEM)); 
    						pItem.mask = LVIF_IMAGE | LVIF_TEXT; 
    						pItem.iItem = i; 
    						pItem.iSubItem = 0; 
    						pItem.pszText = (LPTSTR)(LPCTSTR)(str); 
    						pItem.iImage = m_imageList.Add(hIcon[1]); 
    
    						pList->SetItem(&pItem);
    					}
    				}
    			}
    		}
    	}
    

    Zuesrt überprüfe ich ob die Textdateien schon existsieren, wenn nicht dann erstelle ich sie. Danach gehe ich die Liste durch und überprüfe ob ein Haken einer Checkbox gesetzt wurde oder nicht. Wenn ja, dann speicher ich alle Einträge mit Haken und alle ohne und setze gleichzeitig das neue Icon, je nachdem ob ein Haken da ist oder nicht...

    Danke



  • Reden wir hier von 9000 KB oder MB?
    Und bleibt er dann auf 9000 stehen, oder macht er konstant weiter?



  • CListCtrl?
    füllst du das ding immer weiter auf mit datensätzen... dann wundert mich auch nciht warum der speicherbedarf zunimmt... oder löscht du die alten einträge wieder wenn die liste zu gross wird?



  • Ne, wir reden hier von 9.000KB ( Im Taskmanager steht zwar nur ein 'K', aber ich denke das ist das gleiche)

    Er macht leider konstant weiter...

    Danke
    HiJacker



  • BTW: Vielleicht wäre die Verwendung des ?-Operators in deinem Quelltext angebracht.
    Immerhin hast du 2 fast identische Fallbehandlungen...



  • Windalf schrieb:

    füllst du das ding immer weiter auf mit datensätzen

    Naja, kommt drauf an. Der User des Programms kann entscheiden ob er neue Einträge im ListCtrl machen möchte oder ob er welche löschen möchte...

    SeppSchrott schrieb:

    Vielleicht wäre die Verwendung des ?-Operators in deinem Quelltext angebracht.
    Immerhin hast du 2 fast identische Fallbehandlungen...

    Verstehe nicht ganz was du meinst ... -> ?-Operator ???

    Danke
    HiJacker



  • Also meiner Meinung nach, sind die 9MB noch unkritisch.
    Das ist eben der Adressraum, der deinem Programm zugesprochen wird.
    Der ist oft sehr großzügig bemessen von Windows und wird nach oben korrigiert, wenn dein Programm oft Speicher reserviert.
    Vielleicht hast du aber wirklich irgendwo ein Leck.

    Dann wärs vielleicht sinnvoll, du lässt es wirklich mal etwas länger laufen...
    Also bei ~50 MB darfst du dann Alarm geben 😉



  • HiJacker schrieb:

    Verstehe nicht ganz was du meinst ... -> ?-Operator ???

    pItem.iImage = m_imageList.Add(hIcon[(pList->GetCheck(i)) ? 0 : 1]);
    

    Wenn ich das richtig sehe ist, das der einzige Unterschied.
    Den Rest brauchst du nur einmal.



  • SeppSchrott schrieb:

    Also bei ~50 MB darfst du dann Alarm geben

    Hmm, doch leider habe ich schon die Erfahrung gemacht das ein Programm schon ab ca. 26MB - 30MB abstürtzt. Passiert mir oft wenn ich eine Instanz des IE's für längere Zeit offen habe. Dann löscht sich die IE-Seite nach ca 6 Stunden automatisch und liegt dann meistens zwischen 24 - 30 MB ...

    Und wenn mein Programm weiter so macht, dann ist es bald auch dem Absturz nahe...

    SeppSchrott schrieb:

    pItem.iImage = m_imageList.Add(hIcon[(pList->GetCheck(i)) ? 0 : 1]);

    Danke, werd ich mal testen...

    Danke
    HiJacker



  • Ohne jetzt zu wissen warum und was dein Programm macht hast du hier einen kompletten Designfehler.
    Ein ListCtrl macht nichts alleine.
    Wozu überprüfst du dann jede sekunde ob sich da was ändert.

    CListCtrl sendet, genauso wie alle anderen Controls, Nachrichten wenn sich was ändert.
    Ändere mal auf das und dann sehen wir weiter wo es noch hackt.



  • Du solltest evtl. dafür ne Klasse von CListCtrl ableiten, und dort
    dann die dinge die du brauchst für das ListCtrl implementieren.

    Devil



  • Unix-Tom schrieb:

    CListCtrl sendet, genauso wie alle anderen Controls, Nachrichten wenn sich was ändert.

    Wäre keine schlechte Idee einfach die Messages abzufangen und dann alles zu speichern. Doch gibt es eine Message die Zurückgibt ob eine Checkbox angeklickt wurde ? Mit NM_CLICK geht das nicht ...

    Devil schrieb:

    Du solltest evtl. dafür ne Klasse von CListCtrl ableiten, und dort
    dann die dinge die du brauchst für das ListCtrl implementieren.

    Wenn ich mit den Messages arbeite, werde ich das mal machen...

    Danke
    HiJacker



  • Klar gibt es eine. NM_CLICK.
    Warum sollte das nicht gehen. Das Feld wird in jedem Fall geändert.
    SOmit brauchst du nur den selektieren Eintrag nehmen und damit machen was du willst.



  • Naja, NM_CLICK wird ja nur aufgerufen wenn man ein Item anklickt. Doch wenn man eine Checkbox anklickt dann wird leider nciht das ganze Item selektiert ...
    Sonst wäre es ja kein Problem ...

    habe jetzt mal versucht

    pItem.iImage = m_imageList.Add(hIcon[(pList->GetCheck(i)) ? 0 : 1]);
    

    zu verwenden, leider steigt die Speicherauslastung immer weiter. Zwar diesmal nicht so schnell, aber dafür in 10-Schritten....Das muss auf jedenfall an dem Timer liegen. Würde es eine Message für das anklicken einer Checkbox geben, dann würde ich es so machen...

    Danke
    HiJacker


Anmelden zum Antworten