powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList
25 сообщений из 69, страница 2 из 3
Добавление и удаление строк в 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
25 сообщений из 69, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавление и удаление строк в TStringList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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