我试图用平均值计算每秒的传输文件速度
我在发送的字节总和和 prevSum 之间采取了不同的每秒5次
static long prevSum = 0;
static long[] rate = new long[5];
private static void SpeedPerSec(object o)
{
fileProgress fP = (fileProgress)o; //get the form conrtols
while (busy) // while sending file is active
{
for (int i = 0; i < rate.Length; i++)
{
//diff between the sent bytes and prev sent bytes
rate[i] = (sum - prevSum);
Thread.Sleep(1000/rate.Length);
}
prevSum = sum;
fP.RateLabel(Convert.ToInt64(rate.Average()));
//print the trasnfer rate which take a long value .. it just print the value in MB or KB string
}
}
这是sendFile代码:
public static bool busy = false;
public static Socket client;
public static int packetSize = 1024*8;
public static int count = 0;
public static long fileSize;
public static long sum = 0;
public static void sendFile(string filePath)
{
// run the progres Form
Thread thFP = new Thread(fpRUN);
fileProgress fP = new fileProgress("Sending...");
thFP.Start(fP);
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
string fileName = Path.GetFileName(filePath);
byte[] fileData;
try
{
//sending file name and file size to the server
busy = true;
fileSize = fs.Length;
byte[] fileDetial = null;
string detail = fileName + "," + fileSize.ToString();
fileDetial = Encoding.ASCII.GetBytes(detail);
client.Send(fileDetial);
//sending file data to the server
fileData = new byte[packetSize];
count = 0;
sum = 0;
Thread thSpeed = new Thread(SpeedAndTimeLeft); //*here the thread of SPEED per second method
thSpeed.Start(fP);
fP.SizeLabel(fileSize); // tell the form the file size
Thread thClock = new Thread(fP.clock);
thClock.Start();
while (sum < fileSize)
{
fs.Seek(sum, SeekOrigin.Begin);
fs.Read(fileData, 0, fileData.Length);
count = client.Send(fileData, 0, fileData.Length, SocketFlags.None);
sum += count;
fP.ProgressBarFileHandler(sum,fileSize); //progressbar value
fP.SentLabel(sum, fileSize); //tell the form how much sent }
}
finally
{
busy = false;
fs.Close();
fileData = null;
MessageBox.Show(string.Format("{0} sent successfully", fileName));
}
}
答案 0 :(得分:1)
我不明白你为什么要使用long [] rate变量...如果你想计算传输速率并每秒更新一次,你应该将当前的fileSize存储在一个变量中,然后在睡眠后看到新的fileSize。然后从新的文件中减去先前的fileSieze,并获得最后一秒的传输速率(实时传输速率)。对于一般传输速率,您应该通过在下载/上传开始时采用时间戳来计算它,然后,在每次睡眠之后通过将当前fileSize除以到目前为止的总秒数来计算速率。
答案 1 :(得分:0)
不是每次计算平均值(如果你的费率数组变得非常大,可能会变慢),你可以用这种方式计算。
为了这个例子,请考虑你的费率
long[] rates = new long[] { 5, 1, 3,4 ,2 ,5, 1};
你可以像这样计算每一步的平均值:
double currentAverage = 0;
for (int i = 0; i < rates.Length; i++)
{
long currentRate = rates[i];
int iteration = i + 1;
currentAverage = (currentAverage * i + currentRate) / iteration;
}
然后等一下每个费率样本。