我有一个由5个数字组成的数组向下排列:{ 289,151,69,27,6}:
int[] sortedArray = new int[] { 289, 151, 69, 27, 6 };
表格上有5个进度条。每个进度条的最大值= sortedArrayx
例如:
progressBar0.MaxValue = 289; //First element of array
progressBar1.MaxValue = 151; //2nd
progressBar3.MaxValue = 69; // etc...
我想要实现的是,使所有的进度条增量,直到它们各自的MaxValue为止,但是使它们同时完成。
我首先为数组的每个元素创建了一个新线程。但我找不到让他们一起完成的算法。
int count = 0;
foreach (var item in sortedArray)
{
new Thread(async () =>
{
ProgressBar p = Controls.Find("progressbar" + count.ToString(), true)[0] as ProgressBar;
//how to find the number to increment so they all finish at the same time ? p.Increment(i);
}).Start();
cout +=1;
}
我想用TimeSpan实现一些东西。例如:
所有的进度栏都需要在5秒内到达他们的MaxValue。
我该怎么做呢?
发布于 2017-06-13 02:04:31
当您试图在一段时间内增加这些值时,您需要做的是计算出一个介于0到1之间的因子,指示您离完成的距离有多近(根据您开始工作已经过了多长时间)。
在某处记录下开始的时间。var startTime = DateTime.UtcNow;
然后在您的更新代码中执行以下操作
var elapsedTime = DateTime.UtcNow - startTime; //How long as elapsed
int progress = elapsedTime.TotalSeconds / 5.0; //Small number / a large number is always 0..1
if (progress > 1)
progress = 1;
然后进度条根据0..MaxValue而不是0.1来表示进度,所以您只需将当前的进度因子乘以progressBar.MaxValue
someProgressBar.Value = (int)Math.Ceiling(someProgressBar.MaxValue * progress);
这与计算百分比完全相同(每100 ),您只需将0..1因子乘以100。顺便说一下,这就是计算百分比的方法(smallNumber / bigNumber) * 100。
PS:如果你按照我的建议,使用绝对的时间,那么你的进度条总是在正确的时间完成。在循环中添加小增量(例如在计时器中)的问题是,如果应用程序很忙/滞后,那么您的计时器完成得太晚了。
发布于 2017-06-13 02:00:28
这只是按比例递增的情况。
所以让我们说,为了论证的缘故,它们都会增加5倍。只需将每个最大值除以5,然后在每一步增量上除以该值。
int[] sortedArray = new int[] { 289, 151, 69, 27, 6 };
var incrementCount = 5.0;
int incrementAmount = sortedArray.Select(x => Math.Ceil((float)x/incrementCount )).ToArray();
现在,您有了一个数组,其中包含了每个进度条的适当增量步骤。
发布于 2017-06-13 02:08:54
您需要找到一个地方来编写代码,以增加进度条的值。
timer是一个很好的选择,有了Thread
,您就无法定期更新进度条。
现在让我们创建一个计时器,它每秒钟滴答滴答一次,当计时器滴答滴答时,我们更新进度条。我们选择System.Windows.Forms.Timer
,以便在UI线程上运行滴答事件处理程序。
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000;
myTimer.Tick += (sender, e) => UpdateProgressBars();
myTimer.Start();
下一步是计算每个进度条的值。
对于第一个ProgressBar,在第一个滴定值为289/5,在第二个滴定值为(289/5 * 2)。
因此,UpdateProgressBars方法将如下所示
int counter = 0; //the counter for tick event
private void UpdateProgressBars(object sender, EventArgs e)
{
counter++;
progressbar1.Value = sortedArray[0] * counter / 5;
progressbar2.Value = sortedArray[1] * counter / 5;
...
}
https://stackoverflow.com/questions/44518082
复制