Перейти к содержанию
Fire Monkey от А до Я

Лидеры

  1. Brovin Yaroslav

    Brovin Yaroslav

    Администраторы


    • Баллы

      2

    • Постов

      2 124


  2. Евгений Корепов

    Евгений Корепов

    Пользователи


    • Баллы

      2

    • Постов

      738


  3. Nick Peterson

    Nick Peterson

    Пользователи


    • Баллы

      2

    • Постов

      59


  4. jornada

    jornada

    Пользователи


    • Баллы

      1

    • Постов

      10


Популярный контент

Показан контент с высокой репутацией 28.12.2018 в Сообщения

  1. Все ваши проблемы решаются добавлением трех строчек в код: Перед началом работы, сразу задаем количество строк Memo.Lines.Capacity:=1000000; Мемо сразу зарезервирует в своем TStringList нужный объем. Это позволит сократить накладные расходы на добавление в несколько раз. Перед добавлением строк в Memo обязательно делаем Memo.BeginUpdate; Это отключит перерисовку и другие операции. После добавления строк в Memo обязательно делаем Memo.EndUpdate; Это отрисует все изменения которые мы произвели. Вот итоговый код (в форме еще глобальный счетчик FLinesCounter : Integer;): procedure TForm1.FormCreate(Sender: TObject); Var I : Integer; begin Memo.Lines.Capacity:=1000000; Timer.Interval:=10; FLinesCounter:=1; Memo.BeginUpdate; for I := 1 to 10000 do begin Memo.Lines.Add('Это тест ' + FLinesCounter.ToString); Inc(FLinesCounter); end; Memo.EndUpdate; end; procedure TForm1.Button1Click(Sender: TObject); begin Timer.Enabled:=True; end; procedure TForm1.Log(const AMessage : String); const ConsMaxLogSize = 50000; begin Memo.BeginUpdate; // while Memo.Lines.Count > ConsMaxLogSize do // Memo.Lines.Delete(0); Memo.Lines.Add(AMessage); Memo.GoToTextEnd; Memo.EndUpdate; end; procedure TForm1.TimerTimer(Sender: TObject); begin Log('Это тест ' + FLinesCounter.ToString); Inc(FLinesCounter); end; Код добавляет в Мемо 10 тысяч строк за примерно пол секунды. И добавление по таймеру 100 строк в секунду отнимает примерно 0% процессорного времени. Все будет работать без тормозов до разумного предела, при очень больший количествах строк вы столкнетесь с тормозами выделения памяти приложению, тут нужно будет использовать иные механизмы.
    2 балла
  2. Благодарю! Стало чуть понятнее - если добавлять 1 строку без Memo.BeginUpdate; из-за какого-то другого бага FMX в процедуре TStyledMemo.DoViewportPositionChange ContentSizeChanged выставлялся в TRUE, даже если фактические размеры не менялись. Из-за этого запускался цикл if ContentSizeChanged then begin for I := 0 to FLineObjects.Count - 1 do begin Line := FLineObjects[I]; if Line.Layout <> nil then FLineObjects.UpdateLayoutParams(Line.Layout); Line.InvalidateSize; end; FLineObjects.RenderLayouts; end приводящий к фризам. Если делать Memo.BeginUpdate, этого не происходит; увидеть фризы, о которых я говорю, можно растягивая форму с Memo.Align = Bottom. Теперь к вопросу ЦПУ: Ваш пример в работе на 1-ядерной виртуалке На домашнем компе с GlobalUseDirect2D := false; Прикладываю архив с тестовым проектом, кому интересно поиграться :) MemoSpeedTest.zip
    1 балл
  3. Реализация VCL procedure TTimer.UpdateTimer; begin KillTimer(FWindowHandle, 1); if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then raise EOutOfResources.Create(SNoTimers); end; В FMX иначе, интересно, почему так? есть какая то причина, или просто поленились дописать? procedure TTimer.UpdateTimer; begin {...} FTimerHandle := FPlatformTimer.CreateTimer(FInterval, Timer); if FTimerHandle = 0 then FEnabled := False; // Упс.. таймер просто молча сдохнет)) и будешь гадать что случилось с приложением, почему оно "зависло" end;
    1 балл
  4. Хочу от всей души поздравить с днем рождения нашего модератора Андрея Ефимова @Andrey Efimov. Человек, на которого можно положиться и который всегда готов прийти на помощь. Из года в год помогает нашему форуму становиться лучше. С днем рождения! Успехов тебе в работе, в личных делах. И не забывать про Делфи!
    1 балл
  5. jornada

    Доступ к Yandex.Disk

    Лучше поздно, чем никогда) Например так // RESTRequest1.AddFile(FileName); AStream := TMemoryStream.Create(); AStream.LoadFromFile('D:\1.mp4'); RESTRequest1.AddBody(AStream, ctVIDEO_MP4);
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...