首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使增量同时完成

使增量同时完成
EN

Stack Overflow用户
提问于 2017-06-13 09:53:44
回答 5查看 152关注 0票数 1

我有一个由5个数字组成的数组向下排列:{ 289,151,69,27,6}:

代码语言:javascript
运行
复制
int[] sortedArray = new int[] { 289, 151, 69, 27, 6 };

表格上有5个进度条。每个进度条的最大值= sortedArrayx

例如:

代码语言:javascript
运行
复制
progressBar0.MaxValue = 289; //First element of array

progressBar1.MaxValue = 151; //2nd

progressBar3.MaxValue = 69; // etc...

我想要实现的是,使所有的进度条增量,直到它们各自的MaxValue为止,但是使它们同时完成

我首先为数组的每个元素创建了一个新线程。但我找不到让他们一起完成的算法。

代码语言:javascript
运行
复制
        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。

我该怎么做呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-13 10:04:31

当您试图在一段时间内增加这些值时,您需要做的是计算出一个介于0到1之间的因子,指示您离完成的距离有多近(根据您开始工作已经过了多长时间)。

在某处记录下开始的时间。var startTime = DateTime.UtcNow;

然后在您的更新代码中执行以下操作

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
someProgressBar.Value = (int)Math.Ceiling(someProgressBar.MaxValue * progress);

这与计算百分比完全相同(每100 ),您只需将0..1因子乘以100。顺便说一下,这就是计算百分比的方法(smallNumber / bigNumber) * 100。

PS:如果你按照我的建议,使用绝对的时间,那么你的进度条总是在正确的时间完成。在循环中添加小增量(例如在计时器中)的问题是,如果应用程序很忙/滞后,那么您的计时器完成得太晚了。

票数 2
EN

Stack Overflow用户

发布于 2017-06-13 10:00:28

这只是按比例递增的情况。

所以让我们说,为了论证的缘故,它们都会增加5倍。只需将每个最大值除以5,然后在每一步增量上除以该值。

代码语言:javascript
运行
复制
int[] sortedArray = new int[] { 289, 151, 69, 27, 6 };
var incrementCount = 5.0;
int incrementAmount = sortedArray.Select(x => Math.Ceil((float)x/incrementCount )).ToArray();

现在,您有了一个数组,其中包含了每个进度条的适当增量步骤。

票数 1
EN

Stack Overflow用户

发布于 2017-06-13 10:08:54

您需要找到一个地方来编写代码,以增加进度条的值。

timer是一个很好的选择,有了Thread,您就无法定期更新进度条。

现在让我们创建一个计时器,它每秒钟滴答滴答一次,当计时器滴答滴答时,我们更新进度条。我们选择System.Windows.Forms.Timer,以便在UI线程上运行滴答事件处理程序。

代码语言:javascript
运行
复制
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方法将如下所示

代码语言:javascript
运行
复制
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;
    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44518082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档