Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Задержки в цикле без тормозов программы


Автор: CasperSC 1.2.2010, 06:56
Есть такая проблема: У меня есть кнопка, при задержке на ней курсора мыши, она увеличивается в размерах, вроде как маленькая анимация, но из-за использования задержек System.Threading.Thread.Sleep(10) тормозит отрисовка формы "О программе", так как когда курсор покидает кнопку, она анимированно обратно уменьшается.

Код
        private void btnAboutProg_MouseHover(object sender, EventArgs e)
        {
            if (this.btnAboutProg.Width < 50)
            {
                Point P = new Point(this.chBoxReapeat.Location.X, this.chBoxReapeat.Location.Y);
                for (int i = 0; i < 6; i++)
                {
                    this.btnAboutProg.Width += 12;
                    P.X += 12;
                    this.chBoxReapeat.Location = P;
                    this.chBoxReapeat.Refresh();
                    this.btnAboutProg.Refresh();
                    System.Threading.Thread.Sleep(10);
                }
                this.btnAboutProg.Image = null;
                this.btnAboutProg.Text = "О программе";
            }
        }



и когда покидает курсор кнопку:
Код
        private void btnAboutProg_MouseLeave(object sender, EventArgs e)
        {
            if (this.btnAboutProg.Width > 50)
            {
                Point P = new Point(this.chBoxReapeat.Location.X, this.chBoxReapeat.Location.Y);
                this.btnAboutProg.Text = "";
                for (int i = 0; i < 6; i++)
                {
                    P.X -= 12;
                    this.chBoxReapeat.Location = P;
                    this.chBoxReapeat.Refresh();
                    this.btnAboutProg.Width -= 12;                  
                    System.Threading.Thread.Sleep(10);
                }
                this.btnAboutProg.Image = Properties.Resources.clock;
            }
        }



Возможно ли сделать анимацию в отдельном потоке? Есть ли способ задержки выполнения цикла без тормозов всего приложения? Выложите пожалуйста пример.

Автор: Partizan 1.2.2010, 18:46
CasperSC, тут, наверно, лучше таймером обойтись.

Автор: gambit 1.2.2010, 22:37
А не лучше ли перейти на WPF?

Автор: CasperSC 2.2.2010, 07:52
Незнаю, вообще 1 раз запустил форму WPF ничего не понял и решил оставить на попозже. На компьютере реально штук 30 книг по C#, понакачал и по WPF есть, но пока ещё не прочитал до конца просто по C# книгу, я всё таки работаю и времени в обрез. Надо будет попробовать. А WPF больше подходит для написания небольших игр, чем WinForms?

Автор: mrbrooks 2.2.2010, 09:02
Цитата(CasperSC @  2.2.2010,  07:52 Найти цитируемый пост)
А WPF больше подходит для написания небольших игр, чем WinForms?

Для этого больше подходит XNA.

Автор: Moid 2.2.2010, 15:12
Для данной задачи лучше писать на WPF

Конкретно для твоего случая можно попытаться уменьшить "тормоза" так:


Код

 private void btnAboutProg_MouseHover(object sender, EventArgs e)
        {
            if (this.btnAboutProg.Width < 50)
            {
                Point P = new Point(this.chBoxReapeat.Location.X, this.chBoxReapeat.Location.Y);
                for (int i = 0; i < 6; i++)
                {
                    this.btnAboutProg.Width += 12;
                    P.X += 12;
                    this.chBoxReapeat.Location = P;
                    this.chBoxReapeat.Refresh();
                    this.btnAboutProg.Refresh();
                    System.Threading.Thread.Sleep(10);

Application.DoEvents();
                }
                this.btnAboutProg.Image = null;
                this.btnAboutProg.Text = "О программе";
            }
        }



и когда покидает курсор кнопку:
        
Код

private void btnAboutProg_MouseLeave(object sender, EventArgs e)
        {
            if (this.btnAboutProg.Width > 50)
            {
                Point P = new Point(this.chBoxReapeat.Location.X, this.chBoxReapeat.Location.Y);
                this.btnAboutProg.Text = "";
                for (int i = 0; i < 6; i++)
                {
                    P.X -= 12;
                    this.chBoxReapeat.Location = P;
                    this.chBoxReapeat.Refresh();
                    this.btnAboutProg.Width -= 12;                  
                    System.Threading.Thread.Sleep(10);
Application.DoEvents();
                }
                this.btnAboutProg.Image = Properties.Resources.clock;
            }
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)