TMemoryStream: Exception bei Write



  • Hallo zusammen!
    Nach ewigkeiten melde auch ich mich wieder zurück.

    So, nun zu meinem Problem:
    Ich möchte mittels IdHTTP Dateien aus dem Internet laden.
    Um die Dateien zwischenzuspeichern benutze ich dafür den hier auch (irgendwo) geposteten Quellcode:

    [...]
      Test2->Clear();
      Test->Position = Test->Size;
      IdHTTP1->Request->ContentRangeStart = i * DLRate*2;
      IdHTTP1->Request->ContentRangeEnd = IdHTTP1->Request->ContentRangeStart + DLRate*2;
      IdHTTP1->Get(Edit1->Text,Test2);
      Test->Write(Test2,DLRate*2);
      Application->ProcessMessages();
    [...]
    

    Test und Test2 sind jeweils MemoryStreams.
    i gibt an wo gedownloadet werden soll.
    Edit1 enthält die URL.

    Jetzt bekomme ich, mit einer DLRate von 161024 die "Zugriffsverletzung bei Adresse 0043C461 in Project1.exe ....".
    Bei 8
    1024 funzt es jedoch einwandfrei.
    Auch wenn ich als Größe des Streams "Test2" nur 8*1024 angebe, wird erfolgreich geschrieben. jedoch nur mit 8KB...

    Woran liegt das? Is bestimmt wieder mal ne Kleinigkeit... hab ewig nciht mehr gecodet ;=)

    Vielen Dank im Voraus,
    Jo



  • Mein lieber Herr Gesangsverein... was hat denn die Downloadrate mit der Anzahl zu schreibenden Bytes zu tun?



  • Ich lade immer kleine Teile runter.

    z.B. 8KB. (Siehe Startpunkt und EndPunkt bei Indy HTTP)
    Danach speichere ich diese ab.

    Wenn ich jedoch Teile mit mehr als 8KB downloade kommt beim Schreiben o.g. Fehler.

    Ich möchte aber größere Teile downloaden, da der gesamte Prozess sonst zu lange dauert.

    Jo



  • Für Prozesse die zu lange dauern helfen Threads ganz nett...

    Aber ich hab immernoch nicht begriffen wieso du, wenn du Test2 in das File schreibst, nicht einfach die echte Grösse der in Test2 vorhandenen Daten abgibst sondern nur den Theoretischen Wert?



  • Auch wenn ich Test2->Size angebe kommt der Fehler. Hatte ich zuerst stehen.

    An Threads hatte ich auch schon gedacht, aber das ist für mich eher Neuland und ich dachte mir es geht auch ohne.

    Jo



  • Hmmm und Test2 ist gültig?



  • Wie wäre es mit TFileStream, da TMemoryStream alles in den RAM schreibt, was nicht gerade sehr schön ist... und zweitens... wieso 2 Streams...?
    Wenn du Dateien herunterladen willst, mach das so:

    TFileStream* fs=new TFileStream("C:\\Test.bin",fmCreate);
    IdHTTP1->Get(Edit1->Text,fs);
    delete fs;
    

    Und dann kannst du im IdHTTP1 auch die Ereignisse verwenden, z.B. Application->ProcessMessages(); aufrufen, etc.. sodass man nebenher immernoch Buttons drücken kann, etc.



  • Erstmal vielen Dank euch allen.

    Ich habs jetzt mit den FileStreams hinbekommen.

    Zwar bekomme ich jetzt noch nen Fehler an den Kopf geworfen, wenn ich einen FileStream laden möchte, aber das bekomm ich schon hin.

    Danke,
    Jo



  • Hi,

    wie es ausseiht machst du das selbe wie ich. Ein Frage, wie hast du das mit den Ports hinbekommen ? Wenn du einmal eine HTTP Klasse auf einen bestimmten BoudnPort connecten lässt, dann wird dieser nicht mehr freigegeben(erst nach 4/5 min Löschen der Klassem, wohl von von windoof). Ein Lösung ist eine globale HTTP Classe zu verwenden und damit alle HTTP zugriffe zu erledigen. so habe ich das gemacht, gefällt mich aber nicht unbedingt.

    Hast du herausgefunden, wie man einen Port wieder freigibt ? Sachen wie Socket->Close() etc. zeigt keine Wirkung.

    Danke



  • Bitte die Faustregel beachten: ein Thema pro Thread, ein Thread pro Thema!
    Ein Link auf dein anderes Problem wäre ok, das "Anzetteln" einer Offtopic-Diskussion hingegen ist unschön.

    Der unglaublich kritikfähige, gleich eingeschnappte Moderator.

    😉



  • Endlich mal nett 🙂

    Du hast recht, ich bin noch lange nicht perfekt im Punkte Forum-Verhaltens-Regeln



  • Jansen schrieb:

    Der unglaublich kritikfähige, gleich eingeschnappte Moderator.

    Dem kann ich aus Erfahrung nur zustimmen 😉

    - Der gleich einschnappende User

    😉

    NOTE: Offtopic ist jetzt aber genug ^^


Anmelden zum Antworten