2014-04-30 48 views
0

我正在尝试预测模拟的估计完成时间。在模拟开始时我采取startTime。在每个周期结束时,我拿timeNow。经过的时间timeLapsed通过减去这两个值来计算。平均循环时间(每个循环变化)通过将经过时间除以那时的循环数,即直到那时循环的次数来计算。然后我计算出预计完成时间estimEndTime,将仍然需要的周期数乘以平均周期时间加到timeNowC++ CLI DateTime计算错误

我认为在数据转换中出了点问题,因为estimEndTime的计算不正确。它的预测方式太短,很快。平均周期时间avgCycleTime在30-50秒左右计算,看起来正确。周期的尝试nr是20.

我得到一个警告,将int64的周期数(int i)转换为可能丢失数据的long,但由于avgCycleTime似乎没问题,所以这似乎不是导致错误。

为什么不能正常工作?

代码要领:

long avgCycleTime; 

DateTime startTime = DateTime::Now; 

f1->textBox9->Text = startTime.ToString("dd/MM/yy HH:mm:ss"); 
f1->textBox9->Update(); 

i = 0; // cycle counter 
while (i < nCycl) 
{ 

    // this is where the simulation occurs 

    i++; 

    DateTime timeNow = DateTime::Now; 
    TimeSpan timeLapsed = timeNow.Subtract(startTime); 
    avgCycleTime = (timeLapsed.Ticks/i); 
    DateTime estimEndTime = timeNow.AddTicks(avgCycleTime * (nCycl-i)); 

    f1->textBox10->Text = Convert::ToString(avgCycleTime/10000000); // cycle time in milliseconds 
    f1->textBox11->Text = estimEndTime.ToString("dd/MM/yy HH:mm:ss"); 
    f1->Refresh(); 
} 

回答

1

的问题是,你声明avgCycleTime作为long - 有效Int32。我们假设一个周期需要50秒。在蜱中,这将是50 * 10,000,000 = 500,000,000 - 以及适合Int32。但那么你计算avgCycleTime * (nCycl - i),它溢出(结果将是Int32),因此你无效estimEndTime。所以你必须声明avgCycleTimelong longInt64

+0

再次stackoverflow来拯救!感谢Ulugbek,它现在工作正常。 – jdelange