Szacowany pozostały czas...

0

Witam, mam problem z pokazywaniem szacowanego pozostałego czasu
do zakończenia przesyłania pliku. Wymyśliłem sobie coś bardzo
pokrętnego tzn. na formie z ProgressBarem (pbData) ustawiam
Timer i co sekundę wykonuję coś takiego:

var
  GblTime : TDateTime;
  GblLastPos : Integer;

procedure TfrmWaitOut.TimerTimer(Sender: TObject);
begin
  GblTime := Now - GblTime;
  GblLastPos := pbData.Position - GblLastPos;
  lblTime.Caption := TimeToStr(((pbData.Max - 
    pbData.Position) / GblLastPos) * GblTime);
  GblLastPos := pbData.Position;
  GblTime := Now;
end;

No i to działa ale tragicznie, tzn czasami wyskakują błędy
'invalid floating point' a jak się porusza oknem po pulpicie
to może wyskoczyć 'devision by zero' no i jest fatalnie . . .

Czy ktoś ma jakiś dobry pomysł ?
Może są jakieś komponenty które od razu załatwiają sprawę
pokazywania takich danych jak pozostały czas i stosunek procentowy ?

P.S. tak samo dzieje się jak dam div zamiast '/', tyle że
wtedy pozostały czas zmienia się bardzo nieregularnie...

0
procedure TFormaGlowny.CzasTransferTimer(Sender: TObject);
begin
 TransferLab.Caption:='Transfer: '+IntToStr(TransferPlik)+' KB/s';
 if TransferPlik<>0 then
  begin
   PozostaloPlik:=IntToStr(((RozmiarPlik div 1024)-TotalSize div 1024) div TransferPlik);
   if StrToInt(PozostaloPlik)>=86400 then
    begin
     PozostaloPlik:=IntToStr(StrToInt(PozostaloPlik) div 86400)+' dni';
    end
   else
    if (StrToInt(PozostaloPlik)>=3600) and (StrToInt(PozostaloPlik)<86400) then
     begin
      Schowek1Plik:=StrToInt(PozostaloPlik) div 60 - (StrToInt(PozostaloPlik) div 3600 * 60);
      if Schowek1Plik<10 then
       begin
        Schowek2Plik:=StrToInt(PozostaloPlik) mod 60;
        if Schowek2Plik<10 then
         begin
          PozostaloPlik:=IntToStr(StrToInt(PozostaloPlik) div 3600)+':'+'0'+
          IntToStr(StrToInt(PozostaloPlik) div 60 - (StrToInt(PozostaloPlik) div 3600 * 60))+':'+'0'+
          IntToStr(StrToInt(PozostaloPlik) mod 60);
         end
        else
         begin
          PozostaloPlik:=IntToStr(StrToInt(PozostaloPlik) div 3600)+':'+'0'+
          IntToStr(StrToInt(PozostaloPlik) div 60 - (StrToInt(PozostaloPlik) div 3600 * 60))+':'+
          IntToStr(StrToInt(PozostaloPlik) mod 60);
         end;
       end
      else
       begin
        Schowek2Plik:=StrToInt(PozostaloPlik) mod 60;
        if Schowek2Plik<10 then
         begin
          PozostaloPlik:=IntToStr(StrToInt(PozostaloPlik) div 3600)+':'+
          IntToStr(StrToInt(PozostaloPlik) div 60 - (StrToInt(PozostaloPlik) div 3600 * 60))+':'+'0'+
          IntToStr(StrToInt(PozostaloPlik) mod 60);
         end
        else
         begin
          PozostaloPlik:=IntToStr(StrToInt(PozostaloPlik) div 3600)+':'+
          IntToStr(StrToInt(PozostaloPlik) div 60 - (StrToInt(PozostaloPlik) div 3600 * 60))+':'+
          IntToStr(StrToInt(PozostaloPlik) mod 60);
         end;
       end;
     end
    else
     if (StrToInt(PozostaloPlik)>=60) and (StrToInt(PozostaloPlik)<3600) then
      begin
       Schowek1Plik:=StrToInt(PozostaloPlik) div 60;
       if Schowek1Plik<10 then
        begin
         Schowek1Plik:=StrToInt(PozostaloPlik) mod 60;
         if Schowek1Plik<10 then
          begin
           PozostaloPlik:='00:'+'0'+IntToStr(StrToInt(PozostaloPlik) div 60)+':'+'0'+IntToStr(StrToInt(PozostaloPlik) mod 60);
          end
         else
          begin
           PozostaloPlik:='00:'+'0'+IntToStr(StrToInt(PozostaloPlik) div 60)+':'+IntToStr(StrToInt(PozostaloPlik) mod 60);
          end;
        end
       else
        begin
         Schowek1Plik:=StrToInt(PozostaloPlik) mod 60;
         if Schowek1Plik<10 then
          begin
           PozostaloPlik:='00:'+IntToStr(StrToInt(PozostaloPlik) div 60)+':'+'0'+IntToStr(StrToInt(PozostaloPlik) mod 60);
          end
         else
          begin
           PozostaloPlik:='00:'+IntToStr(StrToInt(PozostaloPlik) div 60)+':'+IntToStr(StrToInt(PozostaloPlik) mod 60);
          end;
        end;
      end
     else
      if StrToInt(PozostaloPlik)<60 then
       begin
        if StrToInt(PozostaloPlik)<10 then
         begin
          PozostaloPlik:='00:00:0'+PozostaloPlik;
         end
        else
         begin
          PozostaloPlik:='00:00:'+PozostaloPlik;
         end;
       end;
   PozostaloLab.Caption:='Pozostało: '+PozostaloPlik;
  end;
 TransferPlik:=0;
end;

Sprubuj to wykorzystać to jest z mojego programu i działa wszystko dobrze bez bledow aha mam jeszcze procent postepu oraz transfer kb/s

0

Boże drogi... ja już widze ze z tym jest chyba coś nie tak.. na oko :)

0

Jezus Maria !

Proszę, błagam, poczytaj o optymalizacji kodu. Twój kod mimo że (jak mówisz) działa, wizualnie wygląda okropnie. Beginów i endów jest tu więcej niż samego kodu wykonywanego....

// sam przyznasz że taka linijka

IntToStr(StrToInt(PozostaloPlik));

równa jest takiej :

PozostaloPlik;

Więc po jasną cholerę wykonywać dodatkowo 4000 cykli procesora ? :-/
A potem cholery marudzą że im się windows wiesza i to na pewno przez tego szatana z Redmond jakim jest Bill G.

0

wiecie co hehehe to jest na 100% dobrze a z tym kodem to wiem ze zle to wyglada ale to rok temu pisalem i wtedy na odwal robilem a teraz robie czysto i czytelnie ale mi sie niechcialo poprawiac tego kodu:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1