首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的用户控件的线程

我的用户控件的线程
EN

Stack Overflow用户
提问于 2013-01-07 15:56:47
回答 1查看 109关注 0票数 0

我有一个用户控件,它以拨号格式(图像)显示速度。

它只有一个方法: SetSpeed(int speed);

然后,它使拨盘从上一设置的速度移动到所需的速度。然后,它在插入中做到了。也就是说,它移动到新的速度。

问题是,如果赛车以10公里/小时的速度行驶,然后(非常快地)达到100公里/小时,转盘可能需要2秒才能达到这个速度……(它不是100%实时的-这是现实的。它移动到新的速度)。

但是,如果在刻度盘达到100 if /h之前,人的速度降到了50 if/h,我需要将运动中断到100,然后开始移动到50。不管拨盘的当前位置(不是速度)如何,我都需要更改“目标速度”。

我的控件使用BackgroundWorker来处理刷新,而不是锁定UI。

所以,我的调用是非常基本的UI:

代码语言:javascript
复制
dial1.SetSpeed(int.Parse(value));

然后,用户控件执行以下操作:

代码语言:javascript
复制
BackgroundWorker bw = new BackgroundWorker();

public void SetSpeed(int speed)
        {
            while(bw.IsBusy)
            {
                Thread.Sleep(50);
            }
            bw.RunWorkerAsync(speed);
        }

以及完成这项工作的方法:

代码语言:javascript
复制
private void UpdateSpeed(object sender, DoWorkEventArgs e)
        {
            var oldSpeed = airSpeed;
            var newSpeed = (int) e.Argument;


            if(oldSpeed <= newSpeed)
            {
                for (int i = oldSpeed; i < newSpeed; i++)
                {
                    airSpeed++;
                    this.Invoke(new MethodInvoker(Refresh));
                }
            }
            else
            {
                for (int i = oldSpeed; i > newSpeed; i--)
                {
                    airSpeed--;
                    this.Invoke(new MethodInvoker(Refresh));

                }

            }
            airSpeed = newSpeed;
        }

当我快速连续地向它发送两个值时,它会锁定...如果线程正在运行,我如何中断它,并改变它的值?

(此外,我认为我更改速度的代码很糟糕-可以更整洁吗?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-07 16:04:01

你不需要。您以适当的方式处理它,使用锁,并检查值是否需要更改。你不能打断它。

基本上,您需要在SetSpeed和Refresh方法之间设置一个锁定区,以便其中一个阻塞另一个。然后,当您设置速度并且线程当前处于临界区时,它将简单地等待,直到更新完成。

你的UpdateSpeed没有任何意义--改变(airspeed--和airspeed++)应该是由计时器驱动的……您当前可以根据处理器速度以“任意”速度更改它们。没有时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14191953

复制
相关文章

相似问题

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