Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
22 / 20 / 5
Регистрация: 29.02.2016
Сообщений: 590
1

Многопоточное обновление richTextBox

28.08.2016, 15:55. Показов 1985. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
джентельмены, есть код:
C#
1
2
3
4
5
6
7
8
9
10
11
            foreach (var item in richTextBox1.Lines)
            {
                string result = await Task.Factory.StartNew<string>(
                                                     () => Wor.SomeLongOperation(item),
                                                     TaskCreationOptions.LongRunning);
                if ((result.Length < 16) &&(result.Length > 7))
                {
                    richTextBox2.AppendText(item);
                }
 
            }
это асинхронный однопоточник, как я понял. решил сделать его же многопоточным:
C#
1
2
3
4
5
6
7
            Parallel.ForEach(richTextBox1.Lines, item => {
            string result = Wor.SomeLongOperation(item);
                if ((result.Length < 16) &&(result.Length > 7))
                {
                    richTextBox2.AppendText(item);
                }
                           });
но тело перестало работать! начились конфликты потоков, кто же из них будет писать в richTextBox2. мне подсказали использовать lock(). но как же его использовать в данном случае, спустя много попыток я не сумел. как мне поступить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2016, 15:55
Ответы с готовыми решениями:

Обновление RichTextBox
Всем привет! Суть: При нажатии на кнопку качается файл(В данном случаи Text.rtf) и он должен...

Обновление RichTextBox, при добавлении текста
К примеру у меня в RichTextBox загружается файл. Так же есть TextBox1, который добовляет запись...

Многопоточное обновление label
Всех приветствую. Есть следующий код с кнопочкой Старт и одним лейблом. Мне необходимо запустить...

Обновление RichTextBox из другого класса
Всем привет. Может эта тема и заезжена уже, но полазив по форуму, я так и не нашел темы с...

3
Эксперт .NET
11095 / 7014 / 1574
Регистрация: 25.05.2015
Сообщений: 21,189
Записей в блоге: 14
28.08.2016, 18:50 2
Сделайте одну точку входа для всех потоков, не завязанную на контрол UI.
Потоки. Синхронизация потоков
0
22 / 20 / 5
Регистрация: 29.02.2016
Сообщений: 590
29.08.2016, 16:59  [ТС] 3

Не по теме:

Ребят, уже много времени ждал ответов, но не было даже глупых ответов!


C#
1
2
3
4
5
6
7
8
9
10
11
string oa="";
            Parallel.ForEach(richTextBox1.Lines, async item =>
            {
                oa = await Task.Factory.StartNew(
                                                       () => Wor.SomeLongOperation(item),
                                                       TaskCreationOptions.LongRunning)+"\n";
                lock (richTextBox2)
                {
                    richTextBox2.AppendText(oa);
                }
            });
Цель: обрабатывать данные построчно из одного ричбокса, и в другой ричбокс писать обработанные строки как можно быстрее(поэтому здесь многопоточность и параллельный цикл)

Проблема, в виде ошибки: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'richTextBox2' не из того потока, в котором он был создан.

Метод решения: мне подсказали использовать lock(), но я не понял, как... Возможно, вы знаете другой способ, который больше подходит сюда, так как вы очень опытные, и вас много.

Очень буду рад любому ответу, особенно - дельному!
0
Эксперт .NETАвтор FAQ
10418 / 5148 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
29.08.2016, 17:44 4
Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Ребят, уже много времени ждал ответов, но не было даже глупых ответов!
Качество ответов напрямую зависит от качества вопроса.
Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Очень буду рад любому ответу, особенно - дельному!
Дельный ответ - код в топку, автора под суд
Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Цель: обрабатывать данные построчно из одного ричбокса, и в другой ричбокс писать обработанные строки как можно быстрее(поэтому здесь многопоточность и параллельный цикл)
Ричтекстбокс это контрол для отображения плоского текста. Он НЕ используется для хранения массивов строк (как у вас), НЕ используется для организации вычислений (как у вас), НЕ используется для хранения результатов вычислений (угадайте как где?).

Вам нужно:
1) Создать модель данных. Если у вас исходный данные это список строк, значит ваша модель это отдельный класс, в ктором есть поле типа ConcurrentQueue<string> содержащее входную очередь обрабатываемых данных.
2) Результаты вычислений складывать также в отдельное поле типа ConcurrentQueue<string>.
3) Вычисления производить в отдельном методе вашего класса данных. В методе в цикле многопоточно считывать данные из входной очереди, обрабатывать, помещать в выходную очередь.
4) Ах, да, ну и пользовательский интерфейс (который делается в последнюю очередь и не имеет никакого отношения к вашим расчетам). Делаете на форме два ListBox (или DGV или ListView). Отображаете в них данные в виртуальном режиме, привязываете их к вашим очередям строк. По таймеру (скажем раз в 100 мс) - обновляете количество строк в контролах, вызываете Invalidate().
1
29.08.2016, 17:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2016, 17:44
Помогаю со студенческими работами здесь

Обновление RichTextBox из другого потока
Доброго времени суток, программисты! Сразу перейду к делу: есть форма, на ней RichTextBox. Как...

Обновление содержания textBox | richTextBox в цикле for
Все доброго времени! Есть файл, он открывается как бинарный, данные выводятся в виде строки....

При любой смене размера richTextBox-а растянуть текст на весь richTextBox
есть richTextBox нужно вывести текст и при любой смене размера richTextBox растянуть этот текст на...

Специальные символы в RichTextBox не учитываются при передаче в другой RichTextBox
Если мы зададим richTextBox1.Text = &quot;123\n123&quot;; мы увидим 123 123 но если мы зададим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru