Downloadgeschwindigkeit mit TidHTTP ermitteln?



  • Hi,

    könntet ihr mir hier evtl. Helfen, da sich die korrekte Übertragungsrate anzeigen lassen kann? 🙂

    void __fastcall TForm4::H1Work(TObject *ASender, TWorkMode AWorkMode,
    	  int AWorkCount)
    {
    ProgressBar1->Position = AWorkCount;
    //Bitarte:
    //TRATE=(float)AWorkCount;
    Application->ProcessMessages();
    //Form4->Caption+FloatToStr(AWorkCount/(1024*1024))+"  MB fertig!";
    BRATE=AWorkCount;
    Label1->Caption=FloatToStr((TRATE)/(1024*1024))+"  MB/s";
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm4::Button3Click(TObject *Sender)
    {
    ShellExecute(Handle, "open", DIR_ONE.c_str(), NULL, NULL, SW_SHOW);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm4::Timer1Timer(TObject *Sender)
    {
    TRATE=BRATE-TRATE;
    }
    

    TRATE und BRATE sind jeweils global als float deklariert.

    danke schonmal für eure Hilfe! 🙂



  • Wo genau liegt das Problem? Du merkst dir den Zeitpunkt des Beginns der Übertragung und summierst den aufgelaufenen Traffic auf. Wenn du den dann durch die verstrichene Zeit teilst hast du deinen Durchsatz.



  • Du willst Wert pro Sekunde zählen, aber in deinem Code werden keine Sekunden erfasst.
    Das sollte dir zu denken geben. 🙂

    Edit: getrödelt 😮



  • Das ist mir schon klar eig mit dem Pro sekunden 😉

    hab nen timer der im intervall 1000 läuft also etwa ne sekunde 🙂

    hab nur löeider das problem, das der traffic der entsteht addiert wird un nicht wie gewünscht BRATE wieder auf 0 gesetzt wird pro sekunde 😞

    void __fastcall TForm4::H1Work(TObject *ASender, TWorkMode AWorkMode,
    	  int AWorkCount)
    {
    ProgressBar1->Position = AWorkCount;
    Application->ProcessMessages();
    BRATE=AWorkCount; //Traffic in BRATE speichern 
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm4::Timer1Timer(TObject *Sender) 
    // timer läuft eine sekunde
    {
    Label1->Caption=FloatToStr(Round((BRATE/(1024*1024)),2))+" MB/s übertragen";
    BRATE=0.0;
    }
    


  • Huch hab grad nen fehler bemerkt 😃

    [cpp]
    void __fastcall TForm4::H1Work(TObject *ASender, TWorkMode AWorkMode,
    int AWorkCount)
    {
    ProgressBar1->Position = AWorkCount;
    TRATE=(double)(AWorkCount);
    Label3->Caption=" 1 BRATE "+FloatToStr(Round((BRATE/(1024*1024)),2)) +" - "+FloatToStr(Round((TRATE/(1024*1024)),2));
    BRATE=AWorkCount-BRATE;
    Application->ProcessMessages();
    }

    Die Zeile BRATE=AWorkCount-BRATE; klappt nur leider auch nicht, der wert von AworkCount der die momentan übertragen bytes ausgibt steigt iwie zu schnell an und das mit dem Application->ProcessMessages(); was ich aus nem Tutorial hatte kann ich nciht recht nachvollziehen wann ich dieses setzen müsste und ob es damit zusammenhängt? 😞



  • Hier wurden zwei Stichpunkte genannt, bitte zeige mir doch mal, wo du die umsetzt.

    1. Traffic aufaddieren
    2. durch verstrichene Zeit dividieren


  • DocShoe schrieb:

    Hier wurden zwei Stichpunkte genannt, bitte zeige mir doch mal, wo du die umsetzt.

    1. Traffic aufaddieren
    2. durch verstrichene Zeit dividieren

    Du kannst dir doch auch den letzten AWorkCount merken und dann das vom neuen abziehen (pro ZEITEINHEIT).
    Das oben gibt einen Durchschnitt, nicht den aktuellen.

    btw: TidHTTP von Indy? Ich meine, da wird das "Work" Ereignis auch regelmäßig (Sekundentakt) aufgerufen, ohne dass ein Timer nötig wird. Hab die aber lange nicht mehr benutzt.



  • Das Work ereignis zählt iwie die zehntel sekunden oder schneller, daher ist doch ein Timer notwendig 😕

    Naja nichts desto trotz, das Problem ist leider hier das die differenz zwischen AworkCount und BRATE nur ansteigt statt des durchschnitts zu zeigen. weiss leider nun garnichts mehr.

    void __fastcall TForm4::H1Work(TObject *ASender, TWorkMode AWorkMode,
    	  int AWorkCount)
    {
    ProgressBar1->Position = AWorkCount;
    TRATE=(double)(AWorkCount);
    BRATE=(double)(AWorkCount)-BRATE;
    Application->ProcessMessages();
    }
    

    Timer 1 Sekunde:

    void __fastcall TForm4::Timer1Timer(TObject *Sender)
    {
    
    //Label2->Caption=" 2 BRATE "+FloatToStr(BRATE);
    Label1->Caption=FloatToStr(Round((BRATE/(1024*1024)),2))+" MB/s übertragen";
    //BRATE=0.0;
    
    }
    


  • Du könntest auch mit Performance Counter die Abstände zwischen den Aufrufen der Work Methode ausrechenen lassen, wenn dieser nicht immer gleich aufgerufen wird.
    Dann brauchst du keinen Timer und must nicht mit der Berechnung friemeln.


Anmelden zum Antworten