c# winform中如何实现用随机数动态改变timer控件的Interval属性

假设点击开始按钮后有一个循环需要间隔5-10秒(随机数)执行一次,假设执行30次停止,或点击中断按钮停止,如果timer不能实现,那么有什么其他的方法吗?不要使用Thre... 假设点击开始按钮后有一个循环需要间隔5-10秒(随机数)执行一次,假设执行30次停止,或点击中断按钮停止,如果timer不能实现,那么有什么其他的方法吗?不要使用Thread.Sleep(因为程序停顿时不能点击停止按钮)!具体代码应该怎么写? 展开
 我来答
syht2000
高粉答主

2019-08-19 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部
方法很多,用不用timer都行,用timer的话并不是按你想的去改什么Interval,Interval可以固定用1000毫秒,原理很简单,你设置一个全局变量比如n,m,n设置初始值为随机数5-10,之后在timer每触发一次,n减1,如果n为0,m加1,同时n再次赋随机数,这个过程直到m等于30为止,然后停止timer
追问
没太明白啊!这个n是什么意思呢?Random r = new Random();  int n = r.Next(5, 10); 

然后每次循环n-1是个什么思路,n为0的话m+1又是什么意思呢?是每5-10秒循环一次,不是每循环一次减1秒呀?是我理解的问题吗?能不能给个简单的代码呢!?
追答
static Random r = new Random();
int n = r.Next(5, 11);
int m = 0;

private void timer1_Tick(object sender, EventArgs e)
{
n--;
if (n == 0)
{
Console.WriteLine("第"+m+"次循环已执行");
m++;
n = r.Next(5, 11);
}
if(m>=30)
{
Console.WriteLine("30次循环已经完成");
timer1.Enabled = false;
}
}
小强没人疼
2019-08-19 · 超过13用户采纳过TA的回答
知道答主
回答量:25
采纳率:58%
帮助的人:10.2万
展开全部

首先计时器可以实现,使用Thread.Sleep也是可以的。

不是使用Thread.Sleep不行的,是你在主线程执行了这个Thread.Sleep,你如果开一个子线程也是可以用Thread.Sleep实现的。

计时器实现方法楼上说的没毛病。下面给一个Thread.Sleep实现代码,开个子线程来循环,

        private void Button4_Click(object sender, EventArgs e)

        {

            _state = true;

            button4.Enabled = false;

            Thread th = new Thread(Test);

            th.IsBackground = true;

            th.Start();

        }

        private void Button5_Click(object sender, EventArgs e)

        {

            _state = false;

            button4.Enabled = true;

        }

        private void Test()

        {

            Random rd = new Random();

            for (int i = 1; i <= 30; i++)

            {

                if (!_state)

                {

                    break;

                }

                int time = rd.Next(5, 11);

                Invoke(new Action(() =>

                {

                    label5.Text = i.ToString();

                    label2.Text = time.ToString();

                }));

                for (int j = 0; j < time; j++)

                {

                    if (!_state)

                    {

                        break;

                    }

                    Thread.Sleep(1000);

                    Invoke(new Action(() =>

                    {

                        label3.Text = (j + 1).ToString();

                    }));

                }

                Invoke(new Action(() =>

                {

                    label5.Text = 0.ToString();

                    label2.Text = 0.ToString();

                    label3.Text = 0.ToString();

                    _state = false;

                    button4.Enabled = true;

                }));

            }

      }

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式