Technician Geschrieben 13. Januar 2003 Geschrieben 13. Januar 2003 Hallo, ich lese in meiner Anwendung sehr große Textdateien ein. Sind die Dateien zu groß (z.B. 700-MB-Textfile :eek: ), gibt's logischerweise Probleme. In diesem Fall erscheint eine MessageBox "Nicht genügend Speicher" (das Programm stürzt aber nicht ab). Dieses Fehlerhandling scheint mir "automatisch" implementiert zu sein. Nun: danach ist die Datei aber noch als "geöffnet" markiert. Soll heißen, vor einem Neustart kann die Datei nicht mehr umbekannt, verschoben etc. werden. Die Datei sollte aber im Fehlerfall geschlossen werden. Ich habe nun einen try-catch-Block eingefügt und fange CFileException und CMemoryException ab. Jedoch ist es anscheinend eine andere Exception. Kann mir jemand sagen, welche das ist :confused: Grüße, Technician Zitieren
Guybrush Threepwood Geschrieben 13. Januar 2003 Geschrieben 13. Januar 2003 Hi, also meiner Meinung nach sollte es eigentlich einer dieser beiden Exceptions sein. Was passiert nach der Fehlermeldung? Mußt du dein Programm selber schließen, oder wird es automatisch beendet, oder stürzt es dann ab? Gruß Guybrush Zitieren
Technician Geschrieben 13. Januar 2003 Autor Geschrieben 13. Januar 2003 Originally posted by Guybrush Threepwood Hi, also meiner Meinung nach sollte es eigentlich einer dieser beiden Exceptions sein. Was passiert nach der Fehlermeldung? Mußt du dein Programm selber schließen, oder wird es automatisch beendet, oder stürzt es dann ab? Gruß Guybrush Die MessageBox hat nur einen OK-Button. Wenn ich den drücke, wird das Anlegen des Dokuments (das mit der zu öffnenden Datei angelegt werden sollte) beendet, und die Anwendung läuft normal weiter. Ich kann dann erneut eine Datei öffnen (oder was immer ich machen will). Nur eben, die Datei wird nicht wirklich geschlossen (vor einem Neustart des Rechners kann ich die Datei nicht mehr bearbeiten). Zitieren
Guybrush Threepwood Geschrieben 13. Januar 2003 Geschrieben 13. Januar 2003 Wenn ich den drücke, wird das Anlegen des Dokuments (das mit der zu öffnenden Datei angelegt werden sollte) beendet, und die Anwendung läuft normal weiter. Du hast doch ein HANDLE oder ein Objekt das mit der Datei verbunden wird, ist das nach dem Fehler noch gültig? Wenn ja müßte man doch darüber die Datei "richtig" schließen können. Zitieren
Technician Geschrieben 13. Januar 2003 Autor Geschrieben 13. Januar 2003 Originally posted by Guybrush Threepwood Du hast doch ein HANDLE oder ein Objekt das mit der Datei verbunden wird, ist das nach dem Fehler noch gültig? Wenn ja müßte man doch darüber die Datei "richtig" schließen können. Ja, ich hab ein gültiges Objekt. Aber mein Problem ist ja, dass ich in keinen catch-Block "reinlaufe": try { file = new CStdioFile(lpszPathName, CFile::modeRead); file->GetStatus(status); file->SeekToBegin(); file->ReadString(data); filepos = 0; dateiLaenge = file->GetLength(); /*Erstell-Datum der Datei ermitteln*/ pFile->SetFileDatum(status.m_ctime); /*Zeilenlänge ermitteln*/ zeilenLaenge = data.GetLength(); pFile->SetFileLengthVorKonv(zeilenLaenge); pFile->SetDateiLaenge(dateiLaenge); } catch(CFileException) { file->Close(); AfxMessageBox("file"); } catch(CMemoryException) { file->Close(); AfxMessageBox("memory"); } // und hier wird weiter ausgelesen... Momento *grübel*.... kann es nicht sein, dass die ganze Misere erst bei "und hier wird weiter ausgelesen" passiert?! Ich mach ja jetzt noch mal nen try-catch-Block rein, und teste das nochmal aus *wenn-das-bloß-nicht-so-lange-dauern-würde* Zitieren
Guybrush Threepwood Geschrieben 13. Januar 2003 Geschrieben 13. Januar 2003 kann es nicht sein, dass die ganze Misere erst bei "und hier wird weiter ausgelesen" passiert?! Könnte natürlich auch sein, aber wenn dein Objekt noch gültig ist könntest du doch versuchen die Datei zu schließen bevor eine andere geöffnet wird oder das Programm beendet wird, egal ob ein Fehler aufgetreten ist oder nicht. *wenn-das-bloß-nicht-so-lange-dauern-würde* Das kenn ich Zitieren
Technician Geschrieben 13. Januar 2003 Autor Geschrieben 13. Januar 2003 Originally posted by Guybrush Threepwood Könnte natürlich auch sein, aber wenn dein Objekt noch gültig ist könntest du doch versuchen die Datei zu schließen bevor eine andere geöffnet wird oder das Programm beendet wird, egal ob ein Fehler aufgetreten ist oder nicht. Schließen, bevor eine andere geöffnet wird - passiert normalerweise sowieso. Nach der Abarbeitung hab ich ein file->Close(); Nur kann das ja logischerweise im Fehlerfall nicht mehr klappen... Originally posted by Guybrush Threepwood Das kenn ich Es dauert ja immer so lange, bis die Datei geöffnet wird, und ich muss die Test-Datei immer erst durch Kopieren einer anderen erzeugen (auf nem lahmen Netzlaufwerk dauert die Prozedur dann so ein halbes Stündchen...) Weiß daher noch nicht, ob der Fehler wirklich erst beim "weiter einlesen" auftritt. Zitieren
Guybrush Threepwood Geschrieben 13. Januar 2003 Geschrieben 13. Januar 2003 Nur kann das ja logischerweise im Fehlerfall nicht mehr klappen... Warum? wenn dein Objekt nach dem Fehler noch Gültig ist, dann muß er es ja auch schließen können. Kuck mal was Close() für einen Fehler verursacht. (auf nem lahmen Netzlaufwerk dauert die Prozedur dann so ein halbes Stündchen...) :eek: Das ist extrem lange, ich hab mal ne Datenbankanwendung geschrieben, da hat er bei einer Tabel mit ca 100000 Datensätzen jedesmal 1-2 Minuten geldaen und das war mir schon zuviel Zitieren
Technician Geschrieben 13. Januar 2003 Autor Geschrieben 13. Januar 2003 Originally posted by Guybrush Threepwood Warum? wenn dein Objekt nach dem Fehler noch Gültig ist, dann muß er es ja auch schließen können. Ich meinte: er kommt gar nicht mehr bis zum "normalen" Schließen, da dies erst nach der Verarbeitung passiert. Normalfall: Datei öffnen Daten auslesen Daten auslesen Daten auslesen Daten auslesen Datei schließen Fehler: Datei öffnen Daten auslesen "nicht genügend Speicher" Das close würde schon noch funktionieren - wenn er überhaupt da hin kommen würde;) Kuck mal was Close() für einen Fehler verursacht. wie gesagt, keinen - er kommt einfach nimmer da hin Der "Testfall Nummer Sowieso" ist jetzt wieder da - seltsamerweise kommt jetzt die MessageBox "Nicht genügend Speicher" gar nicht mehr (besser gesagt, erst nachdem ich den Button zum Schließen des Programms angeklickt habe und das Programm auch schon weg vom Bildschirm ist). Meine MessageBoxen in den catch-Blöcken werden nicht angezeigt. Und die Datei ist noch immer "gesperrt". Originally posted by Guybrush Threepwood :eek: Das ist extrem lange, ich hab mal ne Datenbankanwendung geschrieben, da hat er bei einer Tabel mit ca 100000 Datensätzen jedesmal 1-2 Minuten geldaen und das war mir schon zuviel bin daran gewöhnt - fünf Minuten auf was warten ist bei uns schon äußerst wenig; auch wenn die Verbindung zum RZ (RechenZentrum) einwandfrei ist. Fehler in SQL-Batches mit Laufzeiten von 2 Stunden suchen is auch was feines Zitieren
Guybrush Threepwood Geschrieben 13. Januar 2003 Geschrieben 13. Januar 2003 Das close würde schon noch funktionieren - wenn er überhaupt da hin kommen würde Ok, aber du könntest vor dem öffnen einer Datei und vor dem schließen des Programms prüfen ob du ein gültiges Dateiobjekt hast und wenn ja versuchen dieses zu schließen. Dann würde Close() zumindest immer aufgerufen werden. Fehler in SQL-Batches mit Laufzeiten von 2 Stunden suchen is auch was feines Das grenzt ja schon an Azubi-Quälerei:) ***edit*** Du könntest wenn das Programm nur bei dir laufen soll natürlich auch einfach die Auslagerungsdatei vergrößern, obwohl das natürlich keine richtige Lösung ist. Zitieren
Technician Geschrieben 13. Januar 2003 Autor Geschrieben 13. Januar 2003 Originally posted by Guybrush Threepwood Ok, aber du könntest vor dem öffnen einer Datei und vor dem schließen des Programms prüfen ob du ein gültiges Dateiobjekt hast und wenn ja versuchen dieses zu schließen. Dann würde Close() zumindest immer aufgerufen werden. ja - probier ich aus! Originally posted by Guybrush Threepwood Das grenzt ja schon an Azubi-Quälerei:) ... hat nix mit Azubi zu tun - muss hier jeder machen :cool: (it's our daily business ) Zitieren
Technician Geschrieben 13. Januar 2003 Autor Geschrieben 13. Januar 2003 Originally posted by Guybrush Threepwood ***edit*** Du könntest wenn das Programm nur bei dir laufen soll natürlich auch einfach die Auslagerungsdatei vergrößern, obwohl das natürlich keine richtige Lösung ist. Neee, ausgeschlossen. Das ganze soll nicht nur bei mir laufen, sondern das benutzen ca. 100 User, und zwar immer wieder an anderen Rechnern. Und die Dateien können sogar so groß sein, dass das mit dem Auslagern nimmer sooo ideal ist (kann auch mal ne Datei mit 4 Gig sein, oder dass jemand drei, vier, fünf... solche 700-MB-Dateien öffnen will...) Zitieren
Klotzkopp Geschrieben 13. Januar 2003 Geschrieben 13. Januar 2003 Dann würde ich empfehlen, die Dateien nicht vollständig einzulesen. Zitieren
Technician Geschrieben 13. Januar 2003 Autor Geschrieben 13. Januar 2003 Originally posted by Klotzkopp Dann würde ich empfehlen, die Dateien nicht vollständig einzulesen. Die Dateien werden auch nicht vollständig eingelesen. Soll heißen: zwar größere Datenblöcke, aber nicht komplett. Zum Bearbeiten wirklich extrem großer Dateien (z.B. 100 MB aufwärts) ist die Anwendung auch nicht gedacht --> da gibt's ne Vorverarbeitung zum Splitten. Das mit den 700-MB-Dateien heute war (bzw. ist) "nur" zum Austesten, was passiert, wenn trotzdem jemand derart große Dateien öffnen würde. Zitieren
maxim_42 Geschrieben 15. Januar 2003 Geschrieben 15. Januar 2003 Vieleicht hifts weiter wenn du nicht nur explizit angegebene Fehler auffängst sondern ganz zum Schluss jeden Fehler. (Frag nicht nach der Syntax; ist ne weile her das ich in c++ programmiert hab; es geht jedenfalls) In diesem cach-Block solltest du dann das Problem handeln können. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.