2012-08-27 9 views
5

मैं हजारों फाइलों को डाउनलोड करने में एक लंबा लूप कर रहा हूं। मैं अनुमानित समय बिताना चाहता हूं, क्योंकि इसमें घंटों लग सकते हैं। हालांकि, मैंने जो लिखा है, उसके साथ मुझे मिलीसेकंड की औसत संख्या मिलती है। मैं इस औसत डाउनलोड समय को मिलीसेकंड से TDateTime में कैसे परिवर्तित करूं?मैं मिलीसेकंड को टीडीएटीटाइम में कैसे परिवर्तित करूं?

मैं कहाँ Label1.Caption सेट कर रहा हूं देखें:

procedure DoWork; 
const 
    AVG_BASE = 20; //recent files to record for average, could be tweaked 
var 
    Avg: TStringList; //for calculating average 
    X, Y: Integer; //loop iterators 
    TS, TE: DWORD; //tick counts 
    A: Integer; //for calculating average 
begin 
    Avg:= TStringList.Create; 
    try 
    for X:= 0 to FilesToDownload.Count - 1 do begin //iterate through downloads 
     if FStopDownload then Break; //for cancelling 
     if Avg.Count >= AVG_BASE then //if list count is 20 
     Avg.Delete(0); //remove the oldest average 
     TS:= GetTickCount; //get time started 
     try 
     DownloadTheFile(X); //actual file download process 
     finally 
     TE:= GetTickCount - TS; //get time elapsed 
     end; 
     Avg.Add(IntToStr(TE)); //add download time to average list 
     A:= 0; //reset average to 0 
     for Y:= 0 to Avg.Count - 1 do //iterate through average list 
     A:= A + StrToIntDef(Avg[Y], 0); //add to total download time 
     A:= A div Avg.Count; //divide count to get average download time 
     Label1.Caption:= IntToStr(A); //<-- How to convert to TDateTime? 
    end; 
    finally 
    Avg.Free; 
    end; 
end; 

पुनश्च - क्योंकि मुझे यकीन है कि मेरे स्ट्रिंग कर रहा हूँ मैं पिछले 20 (या AVG_BASE) डाउनलोड की औसत गति की गणना के विभिन्न तरीकों के लिए खुला रहा हूँ, सूची समाधान सबसे अच्छा नहीं है। मैं सभी डाउनलोड के आधार पर इसकी गणना नहीं करना चाहता, क्योंकि उस समय गति बदल सकती है। इसलिए, मैं अभी पिछले 20

उत्तर

10

एक टीडीएटीटाइम मान अनिवार्य रूप से double है, जहां पूर्णांक भाग दिन की संख्या है और अंश वह समय है।

एक दिन वहाँ 24 * 60 * 60 = 86400 सेकंड (SecsPerDay निरंतर SysUtils में घोषित) कर रहे हैं ताकि TDateTime के रूप में एक पाने के लिए कार्य करें:

dt := A/(SecsPerDay*1000.0); // A is the number of milliseconds 

घड़ी को एक बेहतर तरीका समय का उपयोग किया जाएगा TStopWatch इकाई Diagnostics में निर्माण।

उदाहरण:

sw.Create; 
.. 
sw.Start; 
// Do something 
sw.Stop; 
A := sw.ElapsedMilliSeconds; 
// or as RRUZ suggested ts := sw.Elapsed; to get the TimeSpan 

आपके औसत समय प्राप्त करने के लिए, इस moving average रिकॉर्ड का उपयोग करें:

Type 
    TMovingAverage = record 
    private 
    FData: array of integer; 
    FSum: integer; 
    FCurrentAverage: integer; 
    FAddIx: integer; 
    FAddedValues: integer; 
    public 
    constructor Create(length: integer); 
    procedure Add(newValue: integer); 
    function Average : Integer; 
    end; 

procedure TMovingAverage.Add(newValue: integer); 
var i : integer; 
begin 
    FSum := FSum + newValue - FData[FAddIx]; 
    FData[FAddIx] := newValue; 
    FAddIx := (FAddIx + 1) mod Length(FData); 
    if (FAddedValues < Length(FData)) then 
    Inc(FAddedValues); 
    FCurrentAverage := FSum div FAddedValues; 
end; 

function TMovingAverage.Average: Integer; 
begin 
    Result := FCurrentAverage; 
end; 

constructor TMovingAverage.Create(length: integer); 
var 
    i : integer; 
begin 
    SetLength(FData,length); 
    for i := 0 to length - 1 do 
    FData[i] := 0; 
    FSum := 0; 
    FCurrentAverage := 0; 
    FAddIx := 0; 
    FAddedValues := 0; 
end; 
+1

TStopWatch के लिए +1। ध्यान दें कि कुछ कंप्यूटरों पर, मुझे वास्तव में पता चला कि टीएसटॉपवॉच के अंतर्निहित Win32 एपीआई फ़ंक्शंस स्थिर नहीं थे और आईसीएच 4/आईसीएच 5 युग चिपसेट के साथ कुछ इंटेल पेंटियम 4 चिपसेट पर ठीक से काम नहीं करते थे। आधुनिक हार्डवेयर (Core2Duo और बाद में) पर अब कोई समस्या नहीं है, लेकिन ... मैंने मिलीसेकंड को मापने में काफी समय बिताया है (इसे सही तरीके से करने की कोशिश कर रहा है) और विंडोज एपीआई ने मुझे कोशिश करने के लिए बहुत दुख दिया है। (मैं यह नहीं कह रहा हूं कि मुझे कड़ी रीयलटाइम चाहिए, सिर्फ एक मिलीसेकंड काउंटर जो मुझे फ्रीज या लांच नहीं करता है) - TStopWatch GetTickCount से कहीं अधिक सटीक है! –

+0

वास्तव में +1, अब अगर मैं केवल फाइल आकार को ध्यान में रख सकता हूं ....... हालांकि बहुत अलग कहानी ........ –

8
एक TDateTime आप TTimeSpan रिकॉर्ड का उपयोग कर सकते करने के बजाय

जाँच कर रहा हूँ, तो आप एक नया उदाहरण गुजर टिक constructor को गुजरे और यहाँ से आप दिन का उपयोग कर सकते बना सकते हैं, घंटे, मिनट, सेकंड और मिलीसेकंड गुण विलुप्त समय प्रदर्शित करने के लिए। अब शेष समय की गणना करने के लिए आपको डाउनलोड करने के लिए कुल बाइट्स और वर्तमान डाउनलोड बाइट्स की आवश्यकता है।