Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Red Planet
49 / 10 / 3
Регистрация: 20.09.2009
Сообщений: 263

Наполнение TMemo из потока

27.05.2012, 21:48. Показов 2260. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Слишком много данных идет в TMemo. Форма подвисает иногда. Если бы были долгие вычисления, то сделал TThread и все. Но, насколько я знаю, обращаться к компонентам VCL (к тому же TMemo) из стороннего потока не рекомендуется. Как поступить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2012, 21:48
Ответы с готовыми решениями:

Убрать из TMemo запятые, числа расположить в столбик, и вывести все это во второе поле TMemo
Привет всем вообщем помогите с программой ) у нас есть поле TMemo в котором числа расположены числа вида 1231243,123543,21454... и так...

Выполнение слота основного потока через сигнал второстепенного потока
Доброго времени суток! Вопрос следующий. В основном потоке создается кнопка и Qlabel class Ui_QtGuiApp4Class { public: //...

Не получается с вторичного потока обратиться напрямую к объекту из главного потока
Добрый день. Проблема заключается в том что не могу в WPF с вторичного потока обратится на прямую к объекту из главного потока. WPF пока...

18
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.05.2012, 22:51
Было такая проблема, долго морочил себе голову с ней, там потоки мудрил...

Но проблема та не в этом...
Подвисание связано именно с "быстрым" выводом(влекущем перерисовку) и потоком тут не поможешь.

Есть два варианта:

1. Накапливать все элемнты и когда операция закончится вывести все за один раз.
2. Накапливать и выводить значения порциями при помощи таймера.

Что бы уменьшить влияние перерисовки можно использовать
C++
1
2
3
Memo1->Lines->BeginUpdate();
// Код добавления(вывода) вызывающий перерисовку
Memo1->Lines->EndUpdate();
Еще можно играться со свойством Memo1->DoubleBuffered;

Добавлено через 3 минуты
обращаться к компонентам VCL (к тому же TMemo) из стороннего потока не рекомендуется.
Можно через метод синхронизации если это класс от TThread
Но если вывод не чередуется с расчетами то безпонтово.
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
28.05.2012, 09:52
Цитата Сообщение от Red Planet Посмотреть сообщение
Слишком много данных идет в TMemo. Форма подвисает иногда
Я обычно выхожу из положения, делая мэмо невидимым в начале приема большого количества данных (по окончании приема видимость восстанавливаю).
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2012, 16:28
nick42, Достаточно было
C++
1
2
3
Memo1->Lines->BeginUpdate();
// Код добавления(вывода) вызывающий перерисовку
Memo1->Lines->EndUpdate();
- он просто отрисует в конце после вывода
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
28.05.2012, 16:49
Цитата Сообщение от Avazart Посмотреть сообщение
nick42, Достаточно было
Код C++1 2 3 Memo1->Lines->BeginUpdate(); // Код добавления(вывода) вызывающий перерисовку Memo1->Lines->EndUpdate();
- он просто отрисует в конце после вывода
Спасибо. Попробую.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.05.2012, 19:28
LoadFromStream(), LoadFromMemoryStream()
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2012, 19:36
LoadFromStream(), LoadFromMemoryStream()
LK, А это еще к чему?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.05.2012, 19:42
Avazart, к тому, что можно файл загрузить в этот поток, и уже потом из этого потока грузить в мемо, может и быстрей получится.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2012, 19:43
А при чем тут фйл?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.05.2012, 19:49
А, ну да... И откуда оно идет ?
1. Накапливать все элемнты и когда операция закончится вывести все за один раз.
Можно в StringList копить . И еще помнить об ограничении на размер текста в мемо.
Форма подвисает иногда.
Втыкнуть Application->ProcessMessage ?
0
 Аватар для Red Planet
49 / 10 / 3
Регистрация: 20.09.2009
Сообщений: 263
28.05.2012, 21:34  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Memo1->Lines->BeginUpdate();
// Код добавления(вывода) вызывающий перерисовку
Memo1->Lines->EndUpdate();
Во время выполнения вывода здесь форма все равно подвисает (мышкой ее не подергаешь).

Цитата Сообщение от LK Посмотреть сообщение
Application->ProcessMessage
Не силен в этом. В документации прочитал, что это разрешает обработку сообщений. В принципе, проблема в глаза несильно бросается (подвисание и быстрый вывод в TMemo буквально несколько секунд).
LK, можете идею подбросить, что вы имели в виду, когда говорили о ProcessMessages? А я посмотрю не сейчас, а потом.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.05.2012, 21:58
C++
1
2
3
4
5
6
int i,cnt;
cnt =1000;
for (i=0;i<cnt;i++) {
  Memo1->Lines->Add("Lalafafa "+IntToStr(i));
  Application->ProcessMessage();
}
Просто мысль.
C++
1
2
3
4
5
6
7
8
9
TStringList *list = new TStringList;
int i,cnt;
cnt =1000;
for (i=0;i<cnt;i++) {
  list->Add("Lalafafa "+IntToStr(i));
}
Memo->Lines->Assign(list);
// или
Memo->Text = list->Text);
Тоже просто мысль.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2012, 22:00
Во время выполнения вывода здесь форма все равно подвисает (мышкой ее не подергаешь).
Ну в таком случае да нужен поток...
По тому как виснит из -за самого кода...

Например такого:
C++
1
2
for (i=0;i<cnt;i++) {
  list->Add("Lalafafa "+IntToStr(i));
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.05.2012, 22:08
Avazart, а в чем две большие разницы:
Цитата Сообщение от LK Посмотреть сообщение
C++
1
2
for (i=0;i<cnt;i++) {
  list->Add("Lalafafa "+IntToStr(i));
?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2012, 22:29
В том что если заполнение Lines в Мемо грузит основной поток то и TStringList тоже будет грузить
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.05.2012, 22:55
Я имел ввиду разницу между моим, и приведенным вами примерами кода .
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2012, 23:07
Разница в ненужном копировании... другое дело ваш код поместить к поток...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.05.2012, 23:12
Пробовать надо, будет ли заполнение списка тормозить прогу, тормоза, как правило, в отрисовке-перерисовке.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.05.2012, 23:22
Ну так
Сообщение от Avazart
Memo1->Lines->BeginUpdate();
// Код добавления(вывода) вызывающий перерисовку
Memo1->Lines->EndUpdate();
Во время выполнения вывода здесь форма все равно подвисает (мышкой ее не подергаешь).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.05.2012, 23:22
Помогаю со студенческими работами здесь

По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались
Есть 2 потока, в которых в цикле выполняется метод Thread.sleep(200); По нажатию на кнопку из другого потока, нужно чтобы эти 2 потока...

Как из потока управлять формой, если функции потока находятся в другом классе?
Добрый вечер. Возник такой вопрос, никак не могу разобраться. Как из потока управлять формой, если функции потока находятся в другом...

Записать число в начало потока вернувшись с конца потока после записи нескольких элементов...
public static void Save(List&lt;SomeClass&gt; listSC, String fileName) { using (FileStream fs = File.Create(fileName)) ...

Обращение к элементу WinForms из потока, отличного от потока, в котором это элемент был создан
Пишу приложение, котором при загрузке формы в textbox на этой форме заносятся данные. Причем данных много и процесс занимает длительное...

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен. Например, второй поток формируется в классе...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru