Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList / 25 сообщений из 69, страница 1 из 3
22.01.2018, 12:33
    #39588215
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление и удаление строк в TStringList
по таймеру обновляю один из журналов в окне. Из других потоков скидывают в 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
22.01.2018, 12:37
    #39588219
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление и удаление строк в TStringList
Vizit0rМожет кто-то еще сталкивался, как решали вопрос?
Добавь из потока управление командами BeginUpdate, EndUpdate и работа со строками между ними.
Либо создавай между ними буфер, после работы с которым и обновляй что нужно.
...
Рейтинг: 0 / 0
22.01.2018, 12:40
    #39588225
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление и удаление строк в TStringList
wadmanVizit0rМожет кто-то еще сталкивался, как решали вопрос?
Добавь из потока управление командами BeginUpdate, EndUpdate и работа со строками между ними.
Либо создавай между ними буфер, после работы с которым и обновляй что нужно.

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

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

> StealthForm.SystemJournalMemo.Lines.BeginUpdate;

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

> StealthForm.SystemJournalMemo.Lines.BeginUpdate;

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


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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

Еще раз отвечаю на вопрос.
Михаил ЕвгеньевичЧто не так?
YuRockCritSec не может ничего дать или не дать, если к ней не было обращения. А в исходниках компонентов VCL к ней нет обращения.
Если что-то непонятно в этих двух предложениях - дальше обращайтесь в консерваторию.
...
Рейтинг: 0 / 0
22.01.2018, 14:53
    #39588409
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление и удаление строк в TStringList
Михаил ЕвгеньевичВам бы матчасть почитать, похоже.
А, понятно.
...
Рейтинг: 0 / 0
22.01.2018, 14:54
    #39588411
Добавление и удаление строк в TStringList
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
22.01.2018, 15:04
    #39588424
Сюзанна
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление и удаление строк в TStringList
Михаил Евгеньевич,
На винде для передачи сообщений из потока придуманы PostMessage. (на Андроиде - Intent)
...
Рейтинг: 0 / 0
22.01.2018, 15:09
    #39588430
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление и удаление строк в TStringList
Михаил Евгеньевич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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList / 25 сообщений из 69, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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