![]() |
Re: Datei bearbeiten und nur Teile wieder speichern
Also ich habe das jetzt mal mit MemCheck durchgecheckt, aber so wirklich werde ich dadurch nicht schlau.
Delphi-Quellcode:
Man entschuldige mir diesen geposteten Text, aber dabei benötige ich echt Hilfe.
MemCheck version 2.75
TOP 10 Leaks: begin Leak #0 User allocated memory (GetMem) Size: 102 1 Occurence call stack - 0 : (no debug info) Find error: 0012F53C call stack - 1 : Routine @Sysutils@Exception@CreateFmt Find error: 0040C565 call stack - 2 : (no debug info) Find error: 0040CA74 call stack - 3 : Routine @Sysutils@GetExceptionObject Find error: 0040CB6B call stack - 4 : Routine @System@@ExceptionHandler Find error: 00404646 call stack - 5 : (no debug info) Find error: 7C913787 call stack - 6 : (no debug info) Find error: 7C91EAF6 Leak #1 User allocated memory (GetMem) Size: 16 1 Occurence call stack - 0 : (no debug info) Find error: 0012F588 call stack - 1 : Routine @Sysutils@GetExceptionObject Find error: 0040CB6B call stack - 2 : Routine @System@@ExceptionHandler Find error: 00404646 call stack - 3 : (no debug info) Find error: 7C913787 call stack - 4 : (no debug info) Find error: 7C91EAF6 Leak #2 User allocated memory (GetMem) Size: 4 1 Occurence call stack - 0 : (no debug info) Find error: 0012FFE0 call stack - 1 : (no debug info) Find error: 7C816FD3 call stack - 2 : (no debug info) Find error: FFFFFFFC TOP 10 Leaks: end Total leak: 122 bytes *** MEMCHK: Blocks STILL allocated *** Leak #0 User allocated memory (GetMem) Size: 102 1 Occurence call stack - 0 : (no debug info) Find error: 0012F53C call stack - 1 : Routine @Sysutils@Exception@CreateFmt Find error: 0040C565 call stack - 2 : (no debug info) Find error: 0040CA74 call stack - 3 : Routine @Sysutils@GetExceptionObject Find error: 0040CB6B call stack - 4 : Routine @System@@ExceptionHandler Find error: 00404646 call stack - 5 : (no debug info) Find error: 7C913787 call stack - 6 : (no debug info) Find error: 7C91EAF6 Leak #1 User allocated memory (GetMem) Size: 16 1 Occurence call stack - 0 : (no debug info) Find error: 0012F588 call stack - 1 : Routine @Sysutils@GetExceptionObject Find error: 0040CB6B call stack - 2 : Routine @System@@ExceptionHandler Find error: 00404646 call stack - 3 : (no debug info) Find error: 7C913787 call stack - 4 : (no debug info) Find error: 7C91EAF6 Leak #2 User allocated memory (GetMem) Size: 4 1 Occurence call stack - 0 : (no debug info) Find error: 0012FFE0 call stack - 1 : (no debug info) Find error: 7C816FD3 call stack - 2 : (no debug info) Find error: FFFFFFFC *** MEMCHK: End of allocated blocks *** *** MEMCHK: Chronological leak information *** * User allocated memory (GetMem) (Leak #2) Size: 4 * User allocated memory (GetMem) (Leak #1) Size: 16 * User allocated memory (GetMem) (Leak #0) Size: 102 *** MEMCHK: End of chronological leak information *** *** MEMCHK: Blocks written to after destruction *** Bad blocks count: 0 *** MEMCHK: End of blocks written to after destruction *** Danke |
Re: Datei bearbeiten und nur Teile wieder speichern
Hallo Hoschie,
das einzige für mich aus der Ferne erkennbare ist, dass du lediglich 122 Byte verschwendest. Besser helfen kann man dir, wenn du ein Projekt als Quelltext bereit stellst. Das muss nicht dein eigentliches Projekt sein - es genügt ein Demo-Projekt, mit dem man dein Problem nachstellen kann. Freundliche Grüße |
Re: Datei bearbeiten und nur Teile wieder speichern
Im Endeffekt habe ich mit dem reinstellen kein Problem, das einzige was nicht public werden darf ist die Webadrese, allerdings ist es nicht das beste und schönste, denn das rund und "hübsch" machen wollte ich erledigen, wenn alles so läuft wie es soll. Soll ich das Projekt einfach hier reinstellen ??
Gruß Hoschie |
Re: Datei bearbeiten und nur Teile wieder speichern
Besser nicht, sonst verdirbt sich noch jemand die Augen daran.
Wenn aber doch, dann bitte als ZIP-Archiv anhängen - ohne DCU und EXE und Backup-Dateien. |
Re: Datei bearbeiten und nur Teile wieder speichern
Liste der Anhänge anzeigen (Anzahl: 1)
OK, also dann mal los. Ich schilder kurz nochmal die Funktion und den Fehler: Das Programm soll nacheinander und ohne Zwischenpause bestimmte XML Webseiten aufrufen, ein Element Lehrgang und dessen Unterelemente in einer XML-File speichern, wobei die verschiedenen Lehrgangselemente in einer Datei zusammengeführt (immer angehängt) werden. Das Programm läuft, jedoch unterbricht es nach unterschiedlichen Seitenaufrufen und hängt sich auf. Ich vermute das dieses am hohen Speicherbedarf liegt. Je nach Laufzeit waren es bis zu 400 MB Arbeitsspeicher die belegt waren (laut TaskManager). Vielleicht hat ja jemand eine Idee, nachdem er sich den gesamten Quelltext angeschaut hat und kann mir helfen, dieses Phänomen zu beseitigen. Angehängt habe ich jetzt nur mal die passende Unit, denn dort steht alles drin.
Vielen Dank Hoschie |
Re: Datei bearbeiten und nur Teile wieder speichern
Du rufst aus dem event handler für OnDocumentComplete() die Methode Navigate() auf.
Das führt in unseren Breitengraden zu einer indirekten Rekursion. |
Re: Datei bearbeiten und nur Teile wieder speichern
Jo, ich wollte damit sicherstellen, dass die nächste Seite erst aufgerufen wird, sobald die alte Seite abgehandelt wurde. das ganze läuft solange, bis ich über den "Stoppen" Button die Variable vScannen auf False setze.
Meinst du es liegt daran ? |
Re: Datei bearbeiten und nur Teile wieder speichern
Sicher.
Du musst dir unbedingt ein anderes Konzept zurechtlegen. |
Re: Datei bearbeiten und nur Teile wieder speichern
Gibt es denn eine andere Möglichkeit ? Das schockt mich jetzt doch etwas. wie kann ich denn sonst sicherstellen, dass er die nächste seite erst aufruft, wenn die alte abgearbeitet wurde.
|
Re: Datei bearbeiten und nur Teile wieder speichern
Beim Event OnDocumentComplete() möchtest du eigentlich nur SaveBody() ausführen, eventuell noch irgendwelche Steuerungsfunktionen, aber gewiss nicht Navigate(). Es ist auch kein guter Stil, wenn du Button1.Click ausführst - unabhängig vom Katastrophenfaktor.
Eine Weiterschaltung auf einen anderen URL findet in deinem Code nicht statt, aber das weißt du? Mehrerer Seiten hintereinander kannst du auch so abholen:
Delphi-Quellcode:
Getippt und nicht getestet.
const
NAV_TIMEOUT = 5000; // milliseconds var Links: TStrings; procedure Timeout(const url: string); begin ShowMessage('timeout: ' + url); end; function WaitForDocumentComplete(wb: TWebBrowser; timeout: Word): Boolean; var ticks: Cardinal; begin ticks := GetTickCount; repeat Application.ProcessMessages; until (wb.ReadyState = READYSTATE_COMPLETE) or (GetTickCount - ticks > timeout); Result := wb.ReadyState = READYSTATE_COMPLETE; end; begin for i := 0 to Pred(Links.Count) do begin WebBrowser.Navigate(Links[i]); if WaitForDocumentComplete(WebBrowser, NAV_TIMEOUT) then SaveBody else Timeout(Links[i]); end; end; Gute Nacht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz