powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList
69 сообщений из 69, показаны все 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
Добавление и удаление строк в TStringList
    #39588440
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, всё с этого началось 21126824
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588478
YuRock,

Ok! Макнули. Ушел читать матчасть.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588485
Сюзанна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Михаил Евгеньевич,

Harvey-Многопоточность, как это делается в Delphi(2002)

Там указано, что крит.секции не работают с VCL
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588497
Сюзанна,

Спасибо!
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588506
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СюзаннаТам указано, что крит.секции не работают с VCL
Не знаю, что где указано. "крит. секции" везде и со всем работают, ели их использовать. А VCL их не использует, как и каких-либо других средств синхронизации.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588605
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockСюзаннаТам указано, что крит.секции не работают с VCL
Не знаю, что где указано. "крит. секции" везде и со всем работают, ели их использовать. А VCL их не использует, как и каких-либо других средств синхронизации.Synchronize
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588607
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)YuRockпропущено...

Не знаю, что где указано. "крит. секции" везде и со всем работают, ели их использовать. А VCL их не использует, как и каких-либо других средств синхронизации.Synchronize
Я ждал этого поста :)

Synchronize - метод класса TThread. Если считать TThread частью VCL, то, конечно, да.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588609
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЕсли считать TThread частью VCL, то,
Но, к счастью, так даже разработчики дельфИ не считают и поместили Classes.pas в папку Rtl\Common, а не в папку VCL.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588610
kep-ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vizit0rпо таймеру обновляю один из журналов в окне. Из других потоков скидывают в TList строки для добавленияЗачем по таймеру, зачем TList, зачем Critical...

На, балуйся:
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure WmMyLog(var Msg:TMessage); message WM_USER+42;
    class procedure AddMyLog(const aTxt:String); static;
    class procedure Test(Param:Pointer); static;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

class procedure TForm1.AddMyLog(const aTxt: String);
var
  pTxt : Pointer;
begin
  pTxt := nil;
  String(pTxt) := aTxt;                                                          // inc Txt ref
  PostMessage(Form1.Handle, WM_USER+42, GetCurrentThreadId(), IntPtr(pTxt));
end;

procedure TForm1.WmMyLog(var Msg: TMessage);
var
  n : Integer;
  Txt : String;
begin
  Pointer(Txt) := Pointer(Msg.LParam);
  with Memo1 do begin
    for n := Lines.Count-1 downto 42 do Lines.Delete(n);
    SelStart := 0;
    SelLength := 0;
    SetSelText(DateTimeToStr(Now)+ ' : ' + IntToStr(Msg.WParam) + ' : ' + Txt + #$D#$A);
  end;
end;                                                                             // auto dec Txt ref

procedure TForm1.Button1Click(Sender: TObject);
var
 i : Integer;
begin
 for i := 1 to 3 do BeginThread(nil, 0, @TForm1.Test, nil, 0, PCardinal(nil)^);
end;

class procedure TForm1.Test;
var
 i : Integer;
begin
 for i := 1 to 10 do AddMyLog(IntToStr(i));
end;
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588611
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock> Synchronize - метод класса TThread. Если считать TThread частью VCL

Не хотелось встревать в Вашу высоконаучную дискуссию,
но во-первых, "Synchronize" можно сделать и без TThread,
а во-вторых, "если считать TThread частью VCL" - это щас
серьёзный вопрос был или юмор такой?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588617
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам"а во-вторых, если считать TThread частью VCL" - это щас
серьёзный вопрос был или юмор такой?
Во-вторых, это не вопрос был, а речь шла о VCL.

А во-первых, речь шла о средствах синхронизации данных между разными потоками. Так или иначе, Synchronize таким средством не является - он "ставит задание в очередь" на выполнение функции в другом (гуишном) потоке, а не предоставляет монопольный доступ к данным, как это делают средства синхронизации.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588666
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С VCL-ными визуальными компонентами нельзя из потока работать. Необходимо передавать данные в основной, а уже оттуда в компоненты грузить.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588667
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

С некоторыми свойствами VCL компонентов работать из не основного потока можно. Особенно на чтение.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588704
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockГаджимурадов Рустам"а во-вторых, если считать TThread частью VCL" - это щас
серьёзный вопрос был или юмор такой?
Во-вторых, это не вопрос был, а речь шла о VCL.

А во-первых, речь шла о средствах синхронизации данных между разными потоками. Так или иначе, Synchronize таким средством не является - он "ставит задание в очередь" на выполнение функции в другом (гуишном) потоке, а не предоставляет монопольный доступ к данным, как это делают средства синхронизации.я бы сказал у вас довольно узкое представление о средствах синхронизации.
кстати, я в корне не согласен с тем куда его поместили, либо на крайний случай как его назвали
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588706
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если никто не против, отвечу автору))

Пожалуй, ничего тупее, чем делать Delete(0) в цикле, придумать нельзя. Нормальные варианты:
- удалять строки путем копирования Memo.Text во временный StringList, обработка данных там и возврат готового результата обратно в Memo.Text (Undo ведь не надо в Memo, которое read only)
- добавлять строки в начало списка (не надо мудохаться с прокруткой)
- использовать для лога ListBox/ListView/VirtualTree (в виртуальном режиме это будет работать мгновенно)
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588707
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)узкое представление о средствах синхронизацииданных
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588709
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatJaDi,

С некоторыми свойствами VCL компонентов работать из не основного потока можно. Особенно на чтение.С какими, например?
Да сами объекты же компонентов могут перестать существовать во время доступа к ним не из гуи-потока.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588730
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

можно то можно, но сегодня можно, завтра ищем баги - порочная практика
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588761
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockС какими, например?
Код: pascal
1.
If MainForm.CheckBox1.Checked then

вполне рабочая практика для многих случаев.

Да сами объекты же компонентов могут перестать существовать во время доступа к ним не из гуи-потока.
К таким обращатся не надо. По меньшей мере не убедившись в их наличии.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588767
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще потоки почти всегда надо убивать до того как помрет GUI который их использует.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588777
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

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

rgreat
Код: pascal
1.
If MainForm.CheckBox1.Checked then


Наверняка использует свойство Handle для посылки BM_GETCHECK. И если это произойдет до момента, когда окно уже создано (объект-то уже давно создан, но HandleAllocated=False), то получим CreateWindow, вызванный не в том потоке, распихивание хендлов по всяким глобальным несинхронизированным массивам не в том потоке,... В общем - полный крах.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588780
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВообще потоки почти всегда надо убивать до того как помрет GUI который их использует.Это понятно, это обязательно даже в случае строгого НЕобращения к VCL-объектам из доп. потока. Такова логика - поток запустился после появления окон - значит и завершиться должен до закрытия окон, на внешний вид которых он влияет (и/или от которых зависит).
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588915
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
результат:

Код
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
procedure VCLTMemoHelper.GoToTextEnd;
begin
  PostMessage(Handle, WM_VSCROLL, SB_BOTTOM, 0);
end;

....
{$IFDEF HAS_FMX}
procedure MemoStringsDeleteLines(Memo : TMemo; LinesNum: Integer);
var
  MemoText,EndText : String;
  EndPos : Integer;
begin  //FMX cannot make replace for few Memo lines in 1 operation
  MemoText := Memo.Text;
  EndText := Memo.Lines[LinesNum];
  EndPos := PosEx_Sha_Pas_2(EndText,MemoText);
  MemoText := MemoText.Remove(0,EndPos + EndText.Length + Memo.Lines.LineBreak.Length - 1);
  Memo.Text := MemoText;
end;
{$ELSE}
procedure MemoStringsDeleteLines(Memo : TMemo; LinesNum: Integer);
var
  SelEnd: Integer;
begin
  SelEnd := SendMessage(Memo.Handle, EM_LINEINDEX, LinesNum, 0);
  if SelEnd < 0 then Exit;
  SendMessage(Memo.Handle, EM_SETSEL, 0, SelEnd);
  SendTextMessage(Memo.Handle, EM_REPLACESEL, 0, '');
end;
{$ENDIF}

...

procedure TBaseMainFormTransport.SysJournalUpdateTimerTimer(Sender : TObject);
begin
  if AppTerminated then
    Exit;

  SysJournalUpdateListSection.Enter;

  if SysJournalUpdateCount > 0 then
  begin
    StealthForm.SystemJournalMemo.Lines.BeginUpdate;

    StealthForm.SystemJournalMemo.Lines.Add(SysJournalUpdateStr);

    if StealthForm.SystemJournalMemo.Lines.Count > MaxSysJournalLines then
      MemoStringsDeleteLines(StealthForm.SystemJournalMemo,
                             StealthForm.SystemJournalMemo.Lines.Count - MaxSysJournalLines);

    SysJournalUpdateStr := '';
    SysJournalUpdateCount := 0;
    StealthForm.SystemJournalMemo.Lines.EndUpdate;
    {Перетягиваем ползунок сисжурнала в самый низ}
    StealthForm.SystemJournalMemo.GoToTextEnd;
  end;

  SysJournalUpdateListSection.Leave;
end;

...

procedure TBaseMainFormTransport.OnSystemJournalAdded(Sender : TObject; Value : String);
var time : String;      {Добавляем в SystemJournal из потока чара}
begin
  if AppTerminated then
    Exit;

  SysJournalUpdateListSection.Enter;

  time := FormatDateTime('hh:nn:ss:zzz', Now);

  if SysJournalUpdateCount = 0 then
    SysJournalUpdateStr := SysJournalUpdateStr + sLineBreak;
  SysJournalUpdateStr := SysJournalUpdateStr + time + ' [' + TBaseCharacter(Sender).ProfileName + ']: ' + Value;
  Inc(SysJournalUpdateCount);

  SysJournalUpdateListSection.Leave;
end;



На экстрим-тестах с добавлением по 15-20 к сообщений в каждый апдейт (а таймер на 200 мс стоит) - форма почти незаметно дергается при перетаскивании. При обычной работе с окном (не перетаскивании) подлагивания вообще не видны.

Что и требовалось.

fd00ch
>>- удалять строки путем копирования Memo.Text во временный StringList, обработка данных там и возврат готового результата обратно в Memo.Text (Undo ведь не надо в Memo, которое read only)
для FMX сделано почти так, только без ненужного SL. Для VCL заметно быстрее работает через замену кучи строк за раз (см. код)

>>- добавлять строки в начало списка (не надо мудохаться с прокруткой)
тяжелое наследие :) Пробовал пару лет назад изменить, юзвери в один голос просили вернуть обратно, ибо привычно!

>>- использовать для лога ListBox/ListView/VirtualTree (в виртуальном режиме это будет работать мгновенно)[/quot]
Неудобно. В Memo можно быстро и легко копировать, удалить лишние строки и т.д.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39588920
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockrgreatJaDi,

С некоторыми свойствами VCL компонентов работать из не основного потока можно. Особенно на чтение.С какими, например?
Да сами объекты же компонентов могут перестать существовать во время доступа к ним не из гуи-потока.

Тот же memo -- будет сыпаться разными AV при попытке писать в него из других потоков, например, те же логи (и чем больше/чаще пишутся в него данные -- тем больший шанс словить проблемы).
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589164
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiТот же memo -- будет сыпаться разными AV при попытке писать в него из других потоков
а можно подробнее? Лучше пошагово, при каком способе добавления, и каков механизм возникновения AV при этом?
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589171
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

по большому счету - любое обращении к любому свойству объекта TMemo из не гуи-потока может породить исключения, и не только AV. И не только исключения, а просто порчу памяти, что хуже.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589268
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockпо большому счету - любое обращении к любому свойству объекта TMemo из не гуи-потока может породить исключения, и не только AV. И не только исключения, а просто порчу памяти, что хуже.Не говори ерунды, в большинстве своём работа с мемо сводится к посылке сообщений, которые вполне потокобезопасны
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589292
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНе говори ерунды, в большинстве своём работа с мемо сводится к посылке сообщений, которые вполне потокобезопасны
SendMessage и Dispath - посылка сообщений?
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589298
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНе говори ерунды, в большинстве своём работа с мемо сводится к посылке сообщений
Ну опять же ты ерунду говоришь. Посылка сообщений использует свойство Handle, которое использует метод GetHandle, который отнюдь не потокобезопасен.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589303
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanSendMessage и Dispath - посылка сообщений?Первое да. Второе нет
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589400
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerв большинстве своём работа с мемо сводится к посылке сообщений
вот и я об этом

wadmanSendMessage и Dispath - посылка сообщений?
поясни © :)
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589425
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_wadmanSendMessage и Dispath - посылка сообщений?Первое да. Второе нет
Ни то ни другое не отправляет сообщений.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589426
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докпоясни © :)
Да что тут пояснять? И то и другое вызывает напрямую обработчики.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589433
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanДа что тут пояснять? И то и другое вызывает напрямую обработчики.
Да нет, это не так. На прямую вызывается обработчик только для окна, созданного в потоке, в котором произошел вызов SendMessage. Иначе - шлет сообщение в "дополнительную" очередь и ожидает его обработки. Так или иначе сообщение будет обработано в потоке, где создано окно.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589436
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа нет, это не так.
Согласен... Перегрелся малость. :)
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589441
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AV, "потокобезопасность"... Yопта, ну вот зачем хнёй страдать... :(

Тупо создайте в гуи-окне обработчика кастом-сообщений, да и шлите в него из потоков все, что хотите.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589442
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Хотя написано еще круче:
MSDN:SendMessage
If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure .

Как будто можно просто взять и "переключить" потоки, ага. Какое-то сообщение наполовину обработалось, тут поток переключили, обработали сообщение из другого, вернули, и обработали половину первого
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589443
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockи обработали половину первого
"вторую половину" хотел написать
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589450
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockКак будто можно просто взять и "переключить" потоки
Описали красиво, да. Вот и угадай, что в недрах реально происходит.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589457
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanОписали красиво, да. Вот и угадай, что в недрах реально происходит.
Ну моё гадание видит 2 пункта:
1. Очередь сообщений потому и очередь, что следующее сообщение не может начать обрабатываться, пока не закончена обработка предыдущего. Это означает, что сообщение, поступившее в очередь через SendMessage из другого потока, будет ждать как минимум завершения этой обработки (предыдущего сообщения);
2. Если во время обработки сообщения из других потоков в эту очередь поступило несколько сообщений через SendMessage, то они обязательно будут ждать как минимум и окончания обработки этого первоначального сообщения, и друг друга, т.е. еще одна очередь.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589461
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНу моё гадание видит 2 пункта:
Ставлю на то, что в таком случае SendMessage возводит внутренний флаг для GetMessage или PeekMessage, которые в свою очередь этот флаг сбрасывают после обработки.
В винде любят такие хитрости, скрытые от посторонних глаз.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589505
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, wadman,

из процитированного вами обоими следует вывод, что

YuRockлюбое обращении к любому свойству объекта TMemo из не гуи-потока может породить исключения
?

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

между
YuRockобращении к любому свойству объекта TMemoи
Докобщаться между потоками посредством SendMessage/PostMessage
серьезная разница.
...
Рейтинг: 0 / 0
Добавление и удаление строк в TStringList
    #39589558
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockсерьезная разница
дык, ты выражайся однозначнее. Моя твоя не понимай :)
...
Рейтинг: 0 / 0
69 сообщений из 69, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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