Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2017, 18:32   #1
Insider1
 
Регистрация: 13.04.2017
Сообщений: 3
По умолчанию Теоретический вопрос начинающего о потоках

Вот например я двумерным циклом зарисовываю каждый пиксель (для теории):

Код:
   Graphics gr = this.CreateGraphics();

   for(int i=0; i<Width; i++)
   {
      for(int j=0; j<Height; j++)
      {
         gr.FillRectangle(new SolidBrush(Color.Black),new Rectangle(j, i, 1, 1));
      }
   }
И оно зарисовывается внутри строки слева направо, и сами строки потом сверху вниз (визуально видно).
Я решил ускорить этот процесс, покопав я узнал про потоки.
И подумал каждый внутренний цикл просто отдавать новому потоку

Код:
        public struct Data // просто чтобы передать в поток потом параметр i
        {
            public int i;

            public Data(int i)
            {
                this.i = i;
            }
        }

        public void CreateSquaresWidthThreats()
        {
            for (int i = 0; i < Width; i++)
            {
                Data data = new Data(i);
                Thread myThread = new Thread(new ParameterizedThreadStart(Drawlinal));
                myThread.Start(data);
            }
        }

        public void Drawlinal(object data)
        {
            Data localData = (Data)data;

            int i = localData.i;

            for (int j = 0; j < Height; j++)
            {
                lock(locker)
                {
                    gr.FillRectangle(new SolidBrush(Color.Black), new Rectangle(j, i, 1, 1));
                }
            }
        }
и по логике программа должна была начать зарисовывать все строки примерно одновременно слева направо одной стеной, но на деле мало того, что стало выбивать ошибку мол В данный момент объект используется другим процессом. (почему???!!!!) (после чего я добавил оператор lock), но оно теперь делает все тоже самое что первый вариант, только еще медленнее... Вообщем или я не так понял как пользоваться потоками или в них смысла особо и нет. Разъясните пожалуйста если кто-то дочитал и понял меня.
Insider1 вне форума Ответить с цитированием
Старый 13.04.2017, 18:41   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И чем это поможет?

Так не получится, в потоки надо выносить долгие вычисления и т.п., а не работу с UI.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.04.2017, 20:58   #3
hoolygan
Пользователь
 
Регистрация: 11.04.2017
Сообщений: 64
По умолчанию

Ну почему же только вычисления? Моя первая змейка вполне спокойно работала и рисовалась в отдельном потоке. Правда я рисовал не в винформах, а в консольке. Но тут нужно понять работу с потоками и почему к одному объекту нельзя одновременно достучаться с разных потоков. А автор немного плавает в теории, вот и все.
hoolygan вне форума Ответить с цитированием
Старый 14.04.2017, 08:35   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в консоли толком и нет UI.
по хорошему есть UI-поток отвечающий только за интерфейс, и есть вычисляющие.

АНдроид например в этом плане строже, там есть NetworkOnMainThreadException =D
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.04.2017, 10:04   #5
hoolygan
Пользователь
 
Регистрация: 11.04.2017
Сообщений: 64
По умолчанию

Ну это да, UI поток он единственный, и врезаться в него тоже никому не советую. Если так хочется закрасить поверхность - то не нужно идти в лоб, а крась бОльшими полигонами - будет быстрее )
hoolygan вне форума Ответить с цитированием
Старый 14.04.2017, 14:02   #6
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Лучше вообще красить Bitmap в памяти, а потом сразу выводить его.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 16.04.2017, 21:51   #7
vaDS
Пользователь
 
Регистрация: 16.04.2017
Сообщений: 94
По умолчанию

Цитата:
Сообщение от Insider1 Посмотреть сообщение
Код:
Graphics gr = this.CreateGraphics(); for(int i=0; i<Width; i++) { for(int j=0; j<Height; j++) { gr.FillRectangle(new SolidBrush(Color.Black),new Rectangle(j, i, 1, 1)); } }
Если это в OnPaint - это очень плохо. Вы создаете графические интерфейсы и не освобождаете память от них, от Graphics GC(сборщик мусора) не очищает.
Это раз. Почитайте о директиве using.
Два. Изображение не нужно зарисовывать на экране - нужно делать новое изображение в памяти, а потом при обновлении кадра отдавать новое изображение.
Три. Если на формах рисуете, поставьте в свойствах формы DoubleBuffered = true;

Думаю, потоки здесь не причем.
vaDS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Теоретический вопрос по OpenGL f.hump Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 21.01.2013 22:06
Чисто теоретический вопрос strannick Microsoft Office Excel 2 23.12.2012 13:24
Чисто теоретический вопрос strannick Microsoft Office Excel 5 17.11.2012 13:19
Теоретический вопрос по потокам -Jack- Общие вопросы Delphi 6 04.11.2012 11:50
Теоретический Вопрос о поиске diliana Помощь студентам 16 13.06.2009 03:19