| Autor |
Beitrag |
Nikola
      
Beiträge: 55
Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
|
Verfasst: Mo 04.08.03 06:50
Wehrend Übertragung von Paradox ins mySQL 21352 Datensätze,
bricht das Programm bei 19744 Datensatz mit folgendem Fehler.
Schreiben tu ich mit TTable.
| Zitat: | | Im Projekt Konvert.exe ist eine Exception der Klasse EStreamError aufgetreten. Meldung:?Expandieren der Speicher-Stream wegen Speichermangel nicht möglich?. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| procedure TForm1.BitBtn2Click(Sender: TObject); var i : Integer; Z : Longint; mLaenge : Integer; mStr : String; mMerkDatum : array[1..250] of String[4]; mFielNameP : array[1..250] of String[25]; mFielName : array[1..250] of String[25]; begin Z:=0; for i:=1 to 250 do begin mFielNameP[i]:=''; mFielName[i]:=''; mMerkDatum[i]:=''; end; for i:=1 to FldList.Items.Count-1 do begin mStr:=Copy(FldList.Items[i],1,25); mMerkDatum[i]:=Copy(FldList.Items[i],26,4); mLaenge:=Pos(' ', mStr); Delete(mStr,mLaenge,25); if not ('PRIMARY'=Copy(mStr,1,7)) then begin mFielNameP[i]:=mStr; while Pos('-', mStr) > 0 do begin mStr[Pos('-', mStr)]:='_'; end; mFielName[i]:=mStr; end else begin Break; end; end; WorkTable.Active:=TRUE; myTabelle.Open; WorkTable.First; Gauge.MaxValue:=WorkTable.RecordCount; Gauge.Progress:=0; repeat Gauge.Progress:=Gauge.Progress+1; try myTabelle.Insert; for i:=1 to FldList.Items.Count-1 do begin if mFielName[i]>'' then begin if mMerkDatum[i]='DATE' then begin myTabelle.FieldbyName(mFielName[i]).Value:=amiDatum(WorkTable.FieldbyName(mFielNameP[i]).Value); end else begin myTabelle.FieldbyName(mFielName[i]).Value:=WorkTable.FieldbyName(mFielNameP[i]).Value; end; end; end; inc(Z); Zaehler.Caption:=IntToStr(Z); finally myTabelle.Post; end; myTabelle.Cancel; WorkTable.Next; until WorkTable.Eof; myTabelle.Close; WorkTable.Active:=FALSE; Gauge.Progress:=0; end; |
Bitte um Hilfe.
Moderiert von UGrohne: Code- durch Delphi-Tags ersetzt
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 04.08.03 17:58
Hast Du schonmal probiert, genau zu lokalisieren, an welcher Stelle der Error passiert? Nimm mal nen Haltepunkt an den Anfang der Schleife und setz den Durchlaufzähler auf die 19743. Dann gehst Du Schritt für Schritt alles durch und kriegst die Stelle, wo der schöne Fehler passiert. Vll. kann man dann mehr helfen 
|
|
Nikola 
      
Beiträge: 55
Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
|
Verfasst: Di 05.08.03 08:51
Hallo,
es ist ein Arbeitsspeicher Problem,
wehrend der Übertragung weckst der Speicher und dann bricht das Programm ab.
Die frage ist warum weckst er.
Arbeitsspeicher im Rechner 512 MB
mfg.
Nikola
|
|
Neuromancer
      
Beiträge: 42
WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
|
Verfasst: Di 05.08.03 09:01
Normalerweise kann das nicht das Problem sein, denn selbst wenn dir der RAM ausgeht, ist Windows schlau genug und lagert dann auf die Festplatte aus. D.h. die Operation sollte dann langsamer werden, aber nicht einfach aufhören.
Habe den Code nicht genau unter die Lupe genommen, aber was mir auffällt ist, dass du den Post in einem finally-Block untergebracht hast. Das ist ein wenig unglücklich programmiert, denn auf Biegen und Brechen den Post zu erzwingen kann keine Lösung sein.
Wenn der Post jetzt fehlschlägt, dann springt das Programm an dieser Stelle raus. Du solltest ihn besser in einen try-except packen und dann auf den Fehler überprüfen und dir die Fehlermeldung ausgeben lassen.
Gruß
|
|
Neuromancer
      
Beiträge: 42
WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
|
Verfasst: Di 05.08.03 09:11
Vielleicht verdeutlich das der folgende Code ein wenig:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TfrmMain.Button1Click(Sender: TObject); var a, b : integer; begin try a := 1; b := 0; finally b := a div b; end; ShowMessage('Hier sollte es eigentlich weiter gehen...'); end; |
In diesem Beispiel wird der ShowMessage niemals aufgerufen.
Gruß
|
|
Nikola 
      
Beiträge: 55
Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
|
Verfasst: Di 05.08.03 09:23
OK.
versuche in try except
Nikola
|
|
Nikola 
      
Beiträge: 55
Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
|
Verfasst: Di 05.08.03 10:26
hab das ganze in try except gemacht und auch ohne
und der bricht weiter ab!
Habe dann Arbeitspeicher zur anzeige gemacht
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| with mRAM do begin dwLength := SizeOf(mRAM); GlobalMemoryStatus(mRAM); ProgressBar.Max := dwTotalPhys; ProgressBar.Position := dwAvailPhys; ProgressBar.Position := dwTotalPhys - dwAvailPhys; end; |
und die tadsache ist das es permanent fühlt, wenn ehr voll ist und noch ca. 100 Datensätze geschrieben sind brich das Programm ab, es dauert ca. 10 sec. bis sich Delphi wider aufgebaut nach dem Abbruch.
es ist der RAM, wie kann man dem zwischen durch freigeben?
|
|
Nikola 
      
Beiträge: 55
Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
|
Verfasst: Mi 06.08.03 07:26
habe den fahler gefunden und der lag in Komponente,
für myTabelle habe ich die von mySQLDAC und bei Limit wahr 1 eingetragen so das es immer ein RAM verbrauch war habe dann auf 0 gesetzt und es ging ohne Probleme.
Nikola
|
|
|