HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1016
hamyuu残りダウンロード時間の計算4解決


hamyuu

リンク

2013/10/16(Wed) 21:13:44|NO.57639

ファイルをダウンロードしながら残り時間を計算するスクリプトを
自分なりに書いてみたのですが数GBの巨大なファイルを指定すると無限ループしてしまいます。
数百MBまでは大丈夫なようです。

そもそもrepeatを使って計算してるのがおかしいような気がするのですがどうなんでしょう?
数学が苦手なのでプログラムでごまかして作った感じなのですが・・・
わかる方教えてください!

#include "hspinet.as" netinit dim sizecash,3:time="計測中" neturl"http://fs.idownloadlink.com/files/9/xfzlhyupziyzbs/" file="nonnon02200.jpg" ;neturl"https://yoctfs.jp/res/box-l-3tjbnbzwhtosfj4veqk4mk2rtq-1001?account=storage&download=utf-8&" ;Yahooボックスより2.7GB ;file="expires=1381836260&uid=be952f12-3951-49c5-ab71-b4b1dfee80d8&signature=Y2ZhYmZlNjExYTA1ZDk0YzQ2MGI0OWU1ZjRhOTViZWEzMjdhNzY4OQ--" netfileinfo info,file split info,"Content-Length: ",i,info:split info,"\n",info:fsize=int(info) netdlname file netrequest file repeat await 16 redraw 0 color 255,255,255:boxf gosub*dlchk:ms+1 pos 10,10:color:mes ""+int(per)+"% 完了" pos 10,40:mes time pos 10,80:mes ""+size/1048576+"MB/"+fsize/1048576+"MB" redraw 1 if comp=1:break loop stop *dlchk if ms=60{ ms=0:exist file:size=strsize:per=double(size)/double(fsize)*100:sizecash(n)=size-size_:size_=size:n+1:if n=3:n=0 avesize=0:repeat 3:avesize+sizecash(cnt):loop:avesize/3 if avesize>0{ repeat if size+avesize*cnt>=fsize:time=cnt:break;※問題の場所? await 0 loop if int(time)>=600:hour=time/600:min=double(time)/600:min-hour:min*60:min=int(min):time=""+hour+" 時間 "+min+" 分":else:if int(time)>=60:min=time/60:sec=double(time)/60:sec-min:sec*60:sec=int(sec):time=""+min+" 分 "+sec+" 秒":else:;time=""+time+" 秒" } } netexec res if res > 0 : comp=1 if res < 0 : neterror estr:dialog "ERROR "+estr:end return



この記事に返信する


暇人

リンク

2013/10/16(Wed) 21:56:58|NO.57641

>無限ループしてしまいます。
じゃ無くて一回で抜けてるだけじゃ?
int型は32ビット符号付き整数だから 0x80000000 以上はマイナスになる

>fsize=int(info)


fsize=double(info)
にして他の関係する配列変数等も全部double型にすれば良い



hamyuu

リンク

2013/10/16(Wed) 22:35:48|NO.57643

暇人様
回答ありがとうございます。

>>無限ループしてしまいます。
>じゃ無くて一回で抜けてるだけじゃ?
その通りだったようです...

>int型は32ビット符号付き整数だから 0x80000000 以上はマイナスになる
そうなんですか!知らなかったです。そのせいだったんですね。

double型にしたら正常に動作しました。
一人で考えても間違いなくわからなかったですwありがとうございました。非常に助かりました^^



暇人

リンク

2013/10/16(Wed) 22:48:03|NO.57644

後ループ使わなくても

time=int((fsize-size)/avesize)
これでいんじゃない?



hamyuu

リンク

2013/10/16(Wed) 23:03:56|NO.57645

おお!これがちゃんとした計算方法ですね!
こういう計算があるはずと思ってずっと考えていたのですが、結局考え付かずループでごまかしましたw
置き換えました、ありがとうございます。
数学(算数?)勉強し直さなきゃ・・・



ONION software Copyright 1997-2023(c) All rights reserved.