powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList
25 сообщений из 69, страница 1 из 3
Добавление и удаление строк в TStringList
    #39588215
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по таймеру обновляю один из журналов в окне. Из других потоков скидывают в TList строки для добавления.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
  if SysJournalUpdateList.Count > 0 then
  begin
    StealthForm.SystemJournalMemo.Lines.BeginUpdate;

    k := SysJournalUpdateList.Count;
//    if k > 100 then
//      k := 50;

    if StealthForm.SystemJournalMemo.Lines.Count > 100 then
      for n := 1 to k do
        StealthForm.SystemJournalMemo.Lines.Delete(0);

    StealthForm.SystemJournalMemo.Lines.AddStrings(SysJournalUpdateList.ToArray);
    SysJournalUpdateList.Clear;
    StealthForm.SystemJournalMemo.Lines.EndUpdate;
    {Перетягиваем ползунок сисжурнала в самый низ}
    mes.Msg := WM_VSCROLL; // WM_HSCROLL
    mes.ScrollCode := SB_BOTTOM;
    mes.Pos := 0;
    mes.ScrollBar := 0;
    if AppTerminated then
      Exit;
    StealthForm.SystemJournalMemo.Dispatch(mes);
    if StealthForm.SystemJournalMemo.Lines[StealthForm.SystemJournalMemo.Lines.Count] = '' then
    begin
      StealthForm.SystemJournalMemo.ReadOnly := False;
      PostMessage(StealthForm.SystemJournalMemo.handle, WM_KEYDOWN, 8, 1);
      StealthForm.SystemJournalMemo.ReadOnly := True;
    end;
  end;




множественное построчное удаление - это как бы полный тупик, ибо ОЧЕНЬ медленно - каждое удаление это несколько отсылов сообщений. И если в списке на добавку больше 20-30 строк - то по факту главный поток виснет на этом всем.

Пока что из пришедшего в голову - брать первую из строк на удаление, брать Memo.Text, находить в нем эту строку (каждая строка за счет timestamp уникальна, так что накладок не будет), удалять ее и все что после нее, а потом добавлять всё новое, опять же в виде одной строки с #10#13.

Может кто-то еще сталкивался, как решали вопрос?
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588219
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rМожет кто-то еще сталкивался, как решали вопрос?
Добавь из потока управление командами BeginUpdate, EndUpdate и работа со строками между ними.
Либо создавай между ними буфер, после работы с которым и обновляй что нужно.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588225
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanVizit0rМожет кто-то еще сталкивался, как решали вопрос?
Добавь из потока управление командами BeginUpdate, EndUpdate и работа со строками между ними.
Либо создавай между ними буфер, после работы с которым и обновляй что нужно.

1) обновлять же все равно придется из главного потока, что я выигрываю?
2) так у меня же и есть буфер.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588233
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r1) обновлять же все равно придется из главного потока, что я выигрываю?
А это от программиста зависит.

Я много чего делал со строками в главном потоке с подачки доп.потоков и 20-30 строк это мелочи, если там конечно нет предварительного поиска по сотням тысяч строк.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588237
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22.01.2018 12:33, Vizit0r пишет:

> StealthForm.SystemJournalMemo.Lines.BeginUpdate;

Что за идиотская мания пихать Memo во все дыры, включая те, куда оно не
лезет?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588264
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim200022.01.2018 12:33, Vizit0r пишет:

> StealthForm.SystemJournalMemo.Lines.BeginUpdate;

Что за идиотская мания пихать Memo во все дыры, включая те, куда оно не
лезет?


переведи (с)
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588351
А зачем ты удаляешь из Мемо?
Как делал я:
Если надо в онлайне лог выводить, то через TCriticalSection напрямую в Мемо пишу из потока.
Код: pascal
1.
2.
3.
CritSec.Enter;
Form1.Memo1.Lines.Add('Что-то');
CritSec.Leave;



Если в конце лог вывести или по таймеру обновлять, то через TStringList.
Пихаем из всех потоков в TStringList опять же в CriticalSection, а потом в мемо напрямую присвоением

Memo.Lines:=TStringList-переменная.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588356
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Евгеньевич,

Ты в исходники TMemo, TCustomEdit, TControl... свой CritSec тоже повставлял? Если да - тогда ладно.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588367
YuRock,

Не понял тебя.

Что не так?
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588369
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил Евгеньевич,

Всё не так будет, когда окно решит перерисоваться, например, и дернет Form1.Memo1.Lines в момент, когда другой поток спокойненько себе зайдет в CritSec.Enter и изменит Memo1.Lines. Произойдут феерические вещи.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588372
YuRock,

У меня Утилита работает уже больше года. Никаких феерических вещей не происходит. Все обращения к Memo, к кторому обращается поток через CritSec.

Не для того ли CriticalSections придуманы?
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588373
YuRock,

Насколько я понимаю, пока поток из CritSec не выйдет, он не даст перерисовать Memo.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588375
Через критические секции работаю со всеми, практически, элементами на форме. Это и Чекбоксы и Радиогруппы, и Эдиты и прогрессбары и всё остальное. Позволяет менять настройки обработки данных во время выполнения потока.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588377
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил ЕвгеньевичНе для того ли CriticalSections придуманы?
CriticalSections придуманы для синхронизации данных между разными потоками. Ты же своей CritSec только ненадолго замедляешь поток, который изменяет данные, а в потоке, который их читает, использования твоей "CritSec" нету (во всяком случае в куче мест исходников VCL).

Михаил ЕвгеньевичУ меня Утилита работает уже больше года
Значит пока везет.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588385
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил ЕвгеньевичЧерез критические секции работаю со всеми, практически, элементами на форме. Это и Чекбоксы и Радиогруппы, и Эдиты и прогрессбары и всё остальное. Позволяет менять настройки обработки данных во время выполнения потока.
Если при этом всё работает, то можешь смело убирать свои "критические секции" - точно так же будет "работать" и без них. Если, конечно, поток, который "менять настройки обработки данных во время выполнения потока", один. Если несколько - то часть проблемы они решают, да.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588389
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил ЕвгеньевичНасколько я понимаю, пока поток из CritSec не выйдет, он не даст перерисовать Memo
Кто не даст? Поток? Поток не может ничего "дать". И CritSec не может ничего дать или не дать, если к ней не было обращения. А в исходниках компонентов VCL к ней нет обращения.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588390
YuRock,

Ай, как ты не прав. Вот если убрать критические секции, то при обращении к визуальным компонентам формы (Ткнуть в чекбокс, например) она наглухо зависнет и поток тоже.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588393
YuRock,

Вы меня троллите, что ли? Покажите мне Ваш многопоточный проект, пжлст.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588394
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил ЕвгеньевичАй, как ты не прав. Вот если убрать критические секции, то при обращении к визуальным компонентам формы (Ткнуть в чекбокс, например) она наглухо зависнет и поток тоже.
Значит эти микросекунды, на которые ты тормозишь пишущий поток вызовом CritSec.Enter, и влияют на везение.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588398
YuRock,

Я дико извиняюсь, но при чем тут исходники? Код у Вас выполняется где? В исходниках?

Вам бы матчасть почитать, похоже.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588407
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил ЕвгеньевичВы меня троллите, что ли?нет
Михаил ЕвгеньевичПокажите мне Ваш многопоточный проект, пжлст.Не вижу необходимости.

Еще раз отвечаю на вопрос.
Михаил ЕвгеньевичЧто не так?
YuRockCritSec не может ничего дать или не дать, если к ней не было обращения. А в исходниках компонентов VCL к ней нет обращения.
Если что-то непонятно в этих двух предложениях - дальше обращайтесь в консерваторию.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588409
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил ЕвгеньевичВам бы матчасть почитать, похоже.
А, понятно.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588411
YuRock,

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SyncObjs_TCriticalSection.html

Код: pascal
1.
2.
3.
 Use TCriticalSection to safeguard operations that may be disrupted if another thread executes certain sections of code before the operation is completed. Critical sections work like gates that allow only a single thread to enter at a time. Because they block the execution of other threads, overusing critical sections can seriously interfere with performance. 

Critical sections must be global in scope so that they are available to all threads. In every thread, any action that could interfere with the operations safeguarded by the critical section should only take place after calling the Acquire or Enter method. Threads that do not use the critical section for relevant operations can introduce bugs. 
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588424
Сюзанна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Евгеньевич,
На винде для передачи сообщений из потока придуманы PostMessage. (на Андроиде - Intent)
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588430
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил ЕвгеньевичYuRock,

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SyncObjs_TCriticalSection.html

Код: pascal
1.
2.
3.
 Use TCriticalSection to safeguard operations that may be disrupted if another thread executes certain sections of code before the operation is completed. Critical sections work like gates that allow only a single thread to enter at a time. Because they block the execution of other threads, overusing critical sections can seriously interfere with performance. 

Critical sections must be global in scope so that they are available to all threads. In every thread, any action that could interfere with the operations safeguarded by the critical section should only take place after calling the Acquire or Enter method. Threads that do not use the critical section for relevant operations can introduce bugs. 


Исходники VCL правил на предмет взаимодействия со своими критическими секциями?
...
Рейтинг: 0 / 0
25 сообщений из 69, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]