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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2018, 23:38   #1
darkleo
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 20
По умолчанию Ускорение вывода в Memo и какие могут быть альтернативы?

Всем доброго времени суток.
Есть поблема.
Вкратце. Есть два потока.
Один собирает данные в динамический буфер.
Второй отрисовывает данные в Memo.
Все синхронизировано.
Проблема в том, что данные собираемые потоком 1, приходят существенно быстрее чем второй поток их отрисовывает в Memo через Lines.Add
Замена шрифта в Memo на терминал, существенно улучшает положение, но все равно не айс.
Так же варианты с BeginUpdate\Endupdate не улучшают ситуацию.
Собственно вопроса... Как ускорить вывод в Memo? Какую технику лучше применить для вывода текстового лога(который постоянно сыпется) на vcl форму?
Подскажите советом.
Спасибо.
darkleo вне форума Ответить с цитированием
Старый 21.07.2018, 01:39   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

А для чего собственно данные выводятся в визуальный компонент? Вы понимаете что визуальные компоненты существуют для того, чтобы пользователь увидел эти данные и понял их? А если поток не успевает отображать эти данные в визуальном компоненте, то что тогда говорить о пользователе, который гораздо более медленный?
northener вне форума Ответить с цитированием
Старый 21.07.2018, 19:00   #3
darkleo
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 20
По умолчанию

Сниффер-анализтор данных, приходящих с устройства.
Их много.
В итоге имеем ситуацию, когда после 10-15 сек работы, отключаем оборудование , а данные продолжают еще отображаться, потому что поток сбора данных естесственно убежал далеко вперед.
Поэтому и рождается вопрос, есть ли какие либо технологии для быстрого вывода данных.
Представьте себе тот же самый UART. Там можно данные организовать очень быстро... Многие программы не имеют каких либо задержек в отображении данных после физического отключения от оборудования, предоставляющего данные....

Тут речь об этом же....
darkleo вне форума Ответить с цитированием
Старый 22.07.2018, 01:38   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Вы не поняли ни мой вопрос, ни подсказку, которая в нем содержится. Визуальный компонент нужен, когда нужно анализировать данные глазами пользователя! Если анализ глазами не нужен, то Memo надо выкинуть и заменить чем-нибудь невизуальным. Хоть двоичным массивом, хоть типом string, хоть типом TStringList. А ускорить вывод в Мемо вам не удастся никак.
Ну а по поводу "данные продолжают еще отображаться, потому что поток сбора данных естесственно убежал далеко вперед." это неправильный алгоритм/код этих потоков. В чём неправильность угадать не видя кода не возможно.
northener вне форума Ответить с цитированием
Старый 27.11.2018, 01:53   #5
darkleo
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 20
По умолчанию

Всем доброго времени суток.
Сам вопрос задал, в итоге сам его и решил.
Все решается достаточно просто.
Поток сбора данных с переферии собирает полученные данные в TSringlist
Отображение выводится на TListBox с параметром Style:=lbVirtual;
Запускается обычный TTimer с периодом хоть 1мс который обновляет данные TListBox'у
Не забываем обработку данных(чтение в обработчике, запись из потока сбора данных) TStinglist защитить например через критические секции.
Вуаля.
Все прекрасно работает. Ничего не теряется.Совсем. Все отображается с огромной скоростью.
Так же установлен лимит для ListBox на 1000 строк на всякий случай.
Спасибо за наводку, что отображать можно часть данных, а потом все можно сохранить. Ведь у нас есть все данные в TSringlist =)
Ура.
darkleo вне форума Ответить с цитированием
Старый 29.11.2018, 02:12   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от darkleo Посмотреть сообщение
Отображение выводится на TListBox с параметром Style:=lbVirtual;
Запускается обычный TTimer с периодом хоть 1мс который обновляет данные TListBox'у
Решение не самое неграмотное из тех, что я видел. Но оно по определению "дурное".
Нафига пользователю нужно такое "отображение"? Он же не сможет нормально прочитать никакую строчку из этого потока строчек!
Так что мой комментарий к данному варианту решения частично озвученной задачи таков. Если это учебная задача в кулинарном техникуме, то препод должен поставить пятёрку/отлично и выставить вам бутыль. Если это учебная задача в профильном учебном заведении - вы заслуживаете максимум тройки.
northener вне форума Ответить с цитированием
Старый 29.11.2018, 02:21   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Вдогонку. Если это не учебная задача, а реальный проект, за который вам платят, то так и скажите.
northener вне форума Ответить с цитированием
Старый 30.11.2018, 10:55   #8
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 979
По умолчанию

А чем не устроило собирать данные в не визуальный компонент? а потом всё сразу вставлять? собираем всё в List1. а когда надо обновляем ListBox1.
Код:
List1:TStringList;

Form1.ListBox1.Items.Assign(List1);
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 30.11.2018 в 10:58.
IliaIT вне форума Ответить с цитированием
Старый 09.12.2018, 08:06   #9
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
    i:integer;
begin
   s:='';
   For i:=1 to 100000 do
      s:=s+IntToStr(i)+#13#10;
   Memo1.Text:=s;
end;
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 13.12.2018, 15:00   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

1. создание объекта типа
Код:
  var STR : TMemoryStream;
begin
  STR := TMemoryStream.Create;

2. получение данных
Код:
var S : string;
begin
  S := 'СТРОКА ДАННЫХ'+#13#10;
3. добавление в МЕМО
Код:
  STR.Seek(0, soFromEnd);
  STR.Write(S[1], length(S));
  if Assigned(STR) then
    Memo1.Lines.LoadFromStream(STR);
как то так
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какие могут быть последствия от копии сайта? Biffy Помощь студентам 2 03.03.2012 00:49
какие могут быть атрибуты? tema654 Microsoft Office Access 0 05.01.2012 14:02
GetDIBits, нехватка памяти, какие могут быть причины? Пепел Феникса Win Api 4 11.12.2011 01:21
Какие варианты по адаптации кода могут быть? VaLenOK007 Помощь студентам 2 20.06.2011 11:47
Какие проблемы могут быть с цифровой удостоверением? ann200 Microsoft Office Access 2 07.10.2009 17:52