Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятный асинхронный доступ из потоков к GUI. 
:(
    Опции темы
emogot
Дата 20.12.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



Есть такой код:

        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, то все нормально работает. Что я не так делаю? или так и должно быть?

PM MAIL   Вверх
Certain
Дата 20.12.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Тормозит 100% из-за 
Код

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


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

Это сообщение отредактировал(а) Certain - 20.12.2010, 15:42
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
emogot
Дата 20.12.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



Цитата(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 мне не подходит
PM MAIL   Вверх
Certain
Дата 20.12.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.6.2008
Где: Moscow

Репутация: 1
Всего: 4



Код

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

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

Это сообщение отредактировал(а) Certain - 20.12.2010, 16:07
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
emogot
Дата 20.12.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



Цитата(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(), запускается в потоке, не главном.
PM MAIL   Вверх
Voyager
Дата 20.12.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 3
Всего: 18



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


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.12.2010

Репутация: нет
Всего: нет



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

как вы говорите так все и есть, мне просто было важно услышать от того кто знает, нормально это или нет, надеюсь вы знаете что говорите) спасибо большое)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0894 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.