Konkrétně mám na mysli začátek procesu začne v čase tom a tom, uplyne nějaká doba a poté program opět vypíše čas kdy proces zkončil. A také zjistí jak dlouho to trvalo.
Plus samozřejmě z těchto údajů budu chtít tahat přibližný čas ukončení procesu jako při například kopírování ve Win.
Prosím prosím, pomoc :(
Fórum › Pascal
Zjištění času ze systému, použití, vypsání
Přidávám teda už konkrétní problém:
repeat
readln(file,radek)
GetTime(hA,mA,sA,msA);
if msA<msP then msR:=(100-msP+msA) {tohle by melo resit,kdy se setina prevali pres celou}
else msR:=msA-msP;
msC:=msC+msR;
if sA<sP then sR:=(60-sP+sA) {tohle kdyz se vteriny prevali pres 60 sekund}
else sR:=sA-sP;
if mA<mP then mR:=(60-mP+mA)
else mR:=mA-mP;
if hA<hP then hR:=(60-hP+hA)
else hR:=hA-hP;
if msC>=100 then begin sC:=sC+1; msC:=msC-100; end;
if sC>=60 then begin mC:=mC+1; sC:=sC-60; end;
if hC>=60 then begin hC:=hC+1; mC:=mC-60; end;
{tenhle kod uz jen resi pismenka a vypisovani nenulovych hodnot jako 0 hodin}
writeln(' -');
write(' - Uplynulý čas: ');
if hC=1 then koncovka:='a' else koncovka:='y';
if hC>=1 then write(hC,' hodin',koncovka);
if mC=1 then koncovka:='a' else if ((mC>1)and(mC<5)) then koncovka:='y'
else koncovka:=' ';
if mC>=1 then write(mC,' minut',koncovka);
msP:=msA; sP:=sA; mP:=mA; hP:=hA;
if ((mC>=1)or(hC>=1)) then write(' a');
if sC=1 then koncovka:='a' else if ((sC>1)and(sC<5)) then koncovka:='y'
else koncovka:=' ';
writeln(' ',sC,' sekund',koncovka);
{zde se pak deje spouusta cinnosti cteni radku ze souboru a jedno cteni radku trva tak zlomecek sekundy}
until eof(file);
hodnoty A jsou Aktualni, P jsou Puvodni z predchoziho stavu a C jsou celkove soucty casu.
Nekde tam je chyba,protoze to spatne pocita rozdily casu a vyhazuje to nesmyslne hodnoty.
A nejak uz vazne nevim kde a jak co :(
Prosiiim,smutne koukam :(
To Khalashnikovf : Proc tak slozite, je na to figl v unite dos-
procedure PackTime(var T: DateTime; var Time: Longint);
procedure UnpackTime(Time: Longint; var DT: DateTime);
A pak jde proste zjisti casy, ty " zapakovat"(zabalit?konvertovat? no vis co myslim) a pak scitat a odcitat integery, nakonec zase zpatky.
To Krychlik : Prosimte te pekne muzes mi to nejak rozepsat podrobneji? Udelej mi z toho priklad, kdy ja ctu radky nejaky textovyho souboru jako nahore a na kazdym radku zjistuju cas jakej ubeh mezi jedtnolivymi radky.
Resp s timto jsem si uz poradil i ja, i kdyz hrozive :)
GetTime(hA,mA,sA,msA);
if msA<msP then msR:=(100-msP+msA) else msR:=msA-msP;
if sA<sS then sR:=60-sS+sA else sR:=sA-sS;
if ((sR=0)and(mCA=0)) then begin mC:=mC+1; mCA:=1; end;
if ((mC=60)and(hCA=0)) then begin hC:=hC+1; mC:=0; hCA:=1; end;
if sR<>0 then mCA:=0;
if mC<>60 then hCA:=0;
Ale ať se snažim jakkoli, nejde mi udělat aby to dokázalo odhadovat zbývající čas, resp ono to neco odhaduje,ale tak silene to skace, ze vazne nevim jak to uklidnit matematicky :(
zkousel sem vytvaret vsemozne prumerne hodnoty casu mezi jednotlivymi radky a pak jejich vynasobeni poctem radku do konce programu. Taky jsem zkousel vzit jiz uplynuly cas a pocet radku kolik to zvladlo, vydelit mezi sebou a pote vynasobit zbyvajicim poctem radku pro ten novej cas .. nefunguje. problem asi je,ze v mem pripade sou ty promenny typu word (nevim prave jestli je muzu mit treba jako real a tak. To sem radeji nezkousel.
Příklad?
1) Přes Getdate a Gettime zjistíš aktuální datum a čas. Hodnoty uložíš do záznamu typu Datetime. Pustíš na to Packtime a ten ti to všechno převede na jeden longint.
2) Proveď to, co chceš změřit.
3) Zopakuj první krok, jenom výsledek ulož do jiné proměnné.
4) Oba výsledky od sebe odečti a máš dobu trvání, jenže nevím, v jakých je to přesně jednotkách (koukni do helpu, určitě to tam bude).
Nebo si místo použití Packtime můžeš všechno převeď na setiny sekundy:
cas_v_setinach:=setiny+100*(sekundy+60*(minuty+60*(hodiny+24*dny)));
Dny ti dá Getdate, zbytek Gettime; výsledek je longint. Problémy začnou jenom když budeš měřit přes půlnoc na konci měsíce, což se moc často nestává.
Další postup je stejný jako u příkladu s Packtime, jenom máš výsledek rovnou v setinách sekundy a nemusíš ho nijak převádět.
Nebo přímo čti systémový časovač, který se automaticky každých 55 ms zvyšuje o 1. Adresu si z hlavy nepamatuju, koukni třeba do AThelpu.
Osobně nejradši používám čtvrtou možnost: zrychlím systémový časovač, aby netikal po 55 ms, ale po 5 (aby to bylo přesnější). Na přerušení 8 pověsím proceduru, která se stará jednak o to, aby se původní systémová obsluha volala stále v intervalu 55 ms, a jednak o počítání uběhlých milisekund. Takže pak stačí říct: začni počítat milisekundy, něco udělat, počítání stopnout a v příslušné proměnné si uběhlý čas bez jakýchkoli úprav přečíst.
Najdeš to tady: http://mircosoft.ic.cz/download/CAS.PAS
Moje stránka.
To Mircosoft : Děkuju moc, ještě bych potřeboval poradit s tím odhadováním zbývajícího času.
Můj program čte řádky z txt souboru a jejich počet je pokaždé jiný.
Dle mého by se zbýcající čas měl rovnat tomuto: průměrná doba doposavaď přečtených řádků * (celkový počet řádků - aktuální počet přečtených řádků) . Ale tahle hodnota i přes to, že by se měla stále více a více uklidňovat díky průměrné době čtení, tak skáče sem tam sem tam.
Nemáš na to Microsoft nějakou fintu taky?
Předpokládám, že to děláš nějak takhle:
soucet:=0;
NactenoRadku:=0;
CelkemRadku:=neco;
while not eof(soubor) do
begin
CasPred:=ZjistiAktualniCas;
NactiRadek;
CasPo:=ZjistiAktualniCas;
inc(NactenoRadku);
inc(soucet,CasPo-CasPred);
PrumernaDoba:=soucet/NactenoRadku;
ZbyvajiciDoba:=PrumernaDoba*(CelkemRadku-NactenoRadku);
ZobrazZbyvajiciDobu;
end;
Problém je, že načtení řádku je práce na pár milisekund, čili na hranici rozlišovací schopnosti časomíry nebo pod ní. Takže většinou dostáváš nuly nebo občas něco většího, když se načítají interní buffery souboru.
Vtip je v počítání s co nejdelšími časovými úseky, aby se minimalizovala relativní chyba na jedno měření:
soucet:=0;
NactenoRadku:=0;
CelkemRadku:=neco;
CasPred:=ZjistiAktualniCas;
while not eof(soubor) do
begin
NactiRadek;
inc(NactenoRadku);
PrumernaDoba:=(ZjistiAktualniCas-CasPred)/NactenoRadku;
ZbyvajiciDoba:=PrumernaDoba*(CelkemRadku-NactenoRadku);
ZobrazZbyvajiciDobu;
end;
Takhle už by to mělo fungovat.
Moje stránka.
To Mircosoft : Pořád nějak nevím jak mám ten čas "zabalit" potřeboval bych prosím nějaký konkrétní příklad, kdy dostanu čas, zabalim a časem ho porovnám s jiným ... plus okolo ty všechny proměnné.
Takle je to pro mě stále španělská vesnice bohužel :(
Jo a taky co to je to inc? :)
inc(a,b) je totéž, co a:=a+b, inc(a) je totéž, co a:=a+1. Máš to v helpu přímo pod nosem, stačí v editoru napsat "inc", najet na něj kurzorem a zmáčknout Ctrl+F1 (to funguje obecně pro jakékoli slovo, které TP zná... tedy jestli děláš v TP).
A to zabalení - asi takhle:
1) Definuj si kostru funkce ZjistiAktualniCas:
function ZjistiAktualniCas:longint;
Begin
End;
2) Výše popsaným způsobem se mrkni do helpu, jaké přesně parametry potřebují Gettime a Getdate (zpaměti to nevím).
3) Uvnitř té funkce (v sekci var před Begin) si pro ně deklaruj příslušné proměnné (tuším, že to jsou wordy).
4) Do těla funkce (mezi Begin a End) vlož volání Getdate a Gettime, kterým naplníš ty svoje proměnné.
5) Potom výpočet a vrácení výsledné hodnoty: ZjistiAktualniCas:=setiny+100*(sekundy+60*(minuty+60*(hodiny+24*dny)));
Tím dostaneš funkci, která ti vrátí aktuální počet setin sekundy od začátku měsíce. Veličina na první pohled k ničemu, ale když si zjistíš aktuální hodnotu teď, aktuální hodnotu za chvíli a pak je od sebe odečteš, máš počet setin sekundy mezi teď a před chvílí, což je přesně to, co potřebuješ.
Kdybys měl problémy, že by ti vycházely kraviny, zkus některou konstantu v tom výrazu (třeba to číslo 24) přetypovat na longint (longint(24)), protože wordy rády přetékají (když vidí překladač výraz ze samých wordů, vyhradí si pro uložení výsledku taky word, ale ten je na tak velké výsledky malý).
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Zjištěni času souboru — založil Začátečník
Vytvoření rozsahu času (od-do) ze seznamu časů — založil CZechBoY
Uptime systému — založil ingiraxo
Vytvoření rezervačního systému — založil MaxDJs
Moderátoři diskuze