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


Автор: emogot 20.12.2010, 15:02
Есть такой код:

        delegate void AddText(string text, Color color);

        void WriteLog(string text, Color color)
        {
            if (LogRichTextBox.InvokeRequired)
            {
                this.BeginInvoke(new AddText(WriteLog), new object[] { text, color });
            }
            else
            {
                if ((LogRichTextBox.Lines.Length) > 100)
                {
                    LogRichTextBox.Text = string.Empty;
                }
                LogRichTextBox.Select(0, 0);
                Font font = new Font("Tahoma", 8, FontStyle.Regular);
                LogRichTextBox.SelectionFont = font;
                LogRichTextBox.SelectionColor = color;
                LogRichTextBox.SelectedText = text + Environment.NewLine;
            }
        }

        private void Commentation()
        {
            while (flag)
            {
                lock (locker)
                {
                //WriteLog(StartPage.ToString(), Color.FromArgb(/* R */ 0x00, /* G*/ 0x66, /* B */ 0x00));
                //Thread.Sleep(500);
                
                    StartPage++;
                }
            }
        }

Как то не понятно, мне казалось что при таком обращении к GUI, из потока, главное окно не должно тормозить, но оно тормозит. Если ставлю задержку например 500, то все нормально работает. Что я не так делаю? или так и должно быть?

Автор: Certain 20.12.2010, 15:30
Тормозит 100% из-за 
Код

while (flag)           
 {
      lock (locker)
      {
           //WriteLog(StartPage.ToString(), Color.FromArgb(/* R */ 0x00, /* G*/ 0x66, /* B */ 0x00));
           //Thread.Sleep(500);
                
            StartPage++;
      }
 }


используйте Thread или BackGroungWorker

Автор: emogot 20.12.2010, 15:49
Цитата(Certain @ 20.12.2010,  15:30)
Тормозит 100% из-за 
Код

while (flag)           
 {
      lock (locker)
      {
           //WriteLog(StartPage.ToString(), Color.FromArgb(/* R */ 0x00, /* G*/ 0x66, /* B */ 0x00));
           //Thread.Sleep(500);
                
            StartPage++;
      }
 }


используйте Thread или BackGroungWorker

я и использую thread, если бы не использовал, то программа бы просто повисла, BackGroungWorker мне не подходит

Автор: Certain 20.12.2010, 16:03
Код

private void Commentation()
        {
            while (flag)
            {
                lock (locker)
                {
                //WriteLog(StartPage.ToString(), Color.FromArgb(/* R */ 0x00, /* G*/ 0x66, /* B */ 0x00));
                //Thread.Sleep(500);
                
                    StartPage++;
                }
            }
        }

этот метод запускается, на сколько я понял, в главном потоке. Соответственно из-за цикла подвисает главный поток
запустите этот метод в отдельном потоке

Автор: emogot 20.12.2010, 16:20
Цитата(Certain @ 20.12.2010,  16:03)
Код

private void Commentation()
        {
            while (flag)
            {
                lock (locker)
                {
                //WriteLog(StartPage.ToString(), Color.FromArgb(/* R */ 0x00, /* G*/ 0x66, /* B */ 0x00));
                //Thread.Sleep(500);
                
                    StartPage++;
                }
            }
        }

этот метод запускается, на сколько я понял, в главном потоке. Соответственно из-за цикла подвисает главный поток
запустите этот метод в отдельном потоке

Вот етот метод private void Commentation(), запускается в потоке, не главном.

Автор: Voyager 20.12.2010, 16:30
Все логично. Так обновление контролов происходит непрерывно, еще бы не тормозило. Если вы запустили цикл в потоке, это не значит что GUI, который отуда обновляется, летать будет. Доходит? Не делайте ничего с GUI и не будет тормозов.

Автор: emogot 20.12.2010, 16:36
Цитата(Voyager @ 20.12.2010,  16:30)
Все логично. Так обновление контролов происходит непрерывно, еще бы не тормозило. Если вы запустили цикл в потоке, это не значит что GUI, который отуда обновляется, летать будет. Доходит? Не делайте ничего с GUI и не будет тормозов.

как вы говорите так все и есть, мне просто было важно услышать от того кто знает, нормально это или нет, надеюсь вы знаете что говорите) спасибо большое)

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