1

Тема: WinForms доступ до ел. управління і лічильник

Хай. От є на формочці Label, треба зробити лічильник. Ну щоб спочатку воно показувало 3, а через секунду 2, а ще через секунду 1, і ще через секунду має викликатись зовсім інший метод, котрий теж буде працювати з цим Label'ом.
Як це краще реалізувати? А то я попер прям в лоба

  private void button1_Click(object sender, EventArgs e)
        {
            btnGo.Visible = false;
            label1.ForeColor = Color.Red;
            label1.Visible = true;
            for (int i = 0; i < 3; i++)
            {
                label1.Text = (i + 1).ToString();
                Thread.Sleep(1000);
            }
            play();
        }

І звісно, що це не спрацювало, адже сам Thread.Sleep зупиняє весь-превесь головний потік, в котрому, також, відмальовується Label і т.д. Тому в мене йде просто 3 секунди зависання, а потім вже далі працює все.

2

Re: WinForms доступ до ел. управління і лічильник

якось так

private void button1_Click(object sender, EventArgs e)
        {
            Timer t = new System.Windows.Forms.Timer();
            t.Interval = 1000;
            int i = 3;
            t.Tick += (s, ev) =>
                {
                    if (i > 0)
                    {
                        label1.Text = i.ToString();
                        i--;
                    }
                    else
                    {
                        t.Stop();
                        DoSomething(label1);
                    }
                };
            t.Start();
        }

        private void DoSomething(object sender)
        {
            var label = sender as Label;
            if (sender != null)
                label.Text = "boom";
        }
Подякували: FakiNyan1

3

Re: WinForms доступ до ел. управління і лічильник

Може запустити ще один потік? В принципі ніколи такого не робив, може є й краща альтернатива.

4

Re: WinForms доступ до ел. управління і лічильник

truesupport написав:

якось так

private void button1_Click(object sender, EventArgs e)
        {
            Timer t = new System.Windows.Forms.Timer();
            t.Interval = 1000;
            int i = 3;
            t.Tick += (s, ev) =>
                {
                    if (i > 0)
                    {
                        label1.Text = i.ToString();
                        i--;
                    }
                    else
                    {
                        t.Stop();
                        DoSomething(label1);
                    }
                };
            t.Start();
        }

        private void DoSomething(object sender)
        {
            var label = sender as Label;
            if (sender != null)
                label.Text = "boom";
        }

воно так буде працювати?

t.Tick += (s, ev) =>
                {
                    if (i > 0)
                    {
                        label1.Text = i.ToString();
                        i--;
                    }
                    else
                    {
                        t.Stop();
                        DoSomething(label1);
                    }
                };

буде виконуватись в головному потоці?

5

Re: WinForms доступ до ел. управління і лічильник

quez написав:

Може запустити ще один потік? В принципі ніколи такого не робив, може є й краща альтернатива.

та я так і зробив, я просто спочатку ступив, думав, що метод, котрий ми будемо виконувати в іншому потоці, має бути статичний, але в статичному методі недоступні контроли.. А потім виявилось, що метод не має бути статичним xD я просто пам'ятаю, що аби діститись до контролу з іншого потоку, потрібно юзати Invoke, тому підняв свою дупу, та перевірив, яким саме має бути метод, котрий запускається в іншому потоці.
зробив отак

 private void button1_Click(object sender, EventArgs e)
        {
            btnGo.Visible = false;
            label1.ForeColor = Color.Red;
            label1.Visible = true;
            Thread thread = new Thread(new ParameterizedThreadStart(Taimer));
            thread.Start();
        }


        private void Taimer(object obj)
        {
            for (int i = 3; i >0; i--)
            {
                label1.Invoke(new del1(() => { label1.Text = i.ToString(); }));
                Thread.Sleep(1000);
            }
            play();
        }

6

Re: WinForms доступ до ел. управління і лічильник

FakiNyan написав:

воно так буде працювати?

t.Tick += (s, ev) =>
                {
                    if (i > 0)
                    {
                        label1.Text = i.ToString();
                        i--;
                    }
                    else
                    {
                        t.Stop();
                        DoSomething(label1);
                    }
                };

буде виконуватись в головному потоці?

буде працювати, буде виконуватись в тому самому потоці що і UI.

Детальніше тут http://msdn.microsoft.com/en-us/library … .110).aspx
і тут http://stackoverflow.com/questions/5694 … an-the-ui.

А взагаліто цей код не важко перевірити.

Подякували: FakiNyan1