Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Datei bearbeiten und nur Teile wieder speichern (https://www.delphipraxis.net/109379-datei-bearbeiten-und-nur-teile-wieder-speichern.html)

Hoschie 5. Mär 2008 19:08

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:
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 ***
Man entschuldige mir diesen geposteten Text, aber dabei benötige ich echt Hilfe.

Danke

marabu 5. Mär 2008 19:16

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

Hoschie 5. Mär 2008 19:21

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

marabu 5. Mär 2008 19:26

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.

Hoschie 5. Mär 2008 19:51

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

marabu 5. Mär 2008 20:00

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.

Hoschie 5. Mär 2008 20:17

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 ?

marabu 5. Mär 2008 20:25

Re: Datei bearbeiten und nur Teile wieder speichern
 
Sicher.

Du musst dir unbedingt ein anderes Konzept zurechtlegen.

Hoschie 5. Mär 2008 20:38

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.

marabu 5. Mär 2008 21:20

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:
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;
Getippt und nicht getestet.

Gute Nacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.
Seite 5 von 6   « Erste     345 6      

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