Nick Peterson

Пользователи
  • Публикаций

    57
  • Зарегистрирован

  • Посещение

Весь контент Nick Peterson

  1. Nick Peterson

    TMemo для вывода лога тормозит

    Провожу тест: заполняю мемо изначально 100 000 строк, затем в таймере добавляю по 1 строке: procedure TForm19.Timer1Timer(Sender: TObject); begin // While Memo1.Lines.Count > 1000 do Memo1.lines.delete(0); { <- не влияет на поведение } inc(Counter); Memo1.Lines.Add(Format('================== new test string number # %d -- ', [ Counter ])); Memo1.GoToTextEnd; end; Примерно раз в 10 секунд это приложение подвисает секунды на 3-4:(на скрине 2х ядерная виртуалка, т.е. основной поток в эти моменты не отвечает). Загрузка ЦПУ в остальное время тоже не кажется мне адекватной, в сравнении с аналогичным VCL приложением: Первую проблему с фризами можно убрать таким образом: В этом случае отображения скроллбаров становится не совсем корректным, зато убираются фризы, сильно раздражающие пользователей. Вопросы такие: 1) есть ли более быстрый аналог TMemo (для целей вывода лога с возможностью копировать из лога куски, не обязательно целые строки, т.к. ListBox не подходит ) 2) Можно ли как-то получше оптимизировать работу с имеющимся TMemo? P.S. 100 000 строк взято для наглядности. В реальном приложении в логе около 1-3 тыс. строк, но и загружено оно помимо вывода лога другими задачами, так что фризы все равно ощутимы.(хотя и не так видны на графике ЦПУ)
  2. Проблема в коде FMX, который не способен справится с нестандартным железом. P.S. Если только у вас масштаб в винде не 100%, тогда возможно у вас просто смещение неверно задано ( +1 не равно 1 физ. пикселю) Проверьте 3 варианта (просто напишите в dpr файле). Как минимум в одном из них у вас будут глюки, тогда зайдите на quality.embarcadero.com и опишите глюк, если не затруднит. Никто этого не делает, воз и ныне там, в новых релизах глюков только больше GlobalUseGPUCanvas := false; // true - проверить так и сяк GlobalUseDirect2D := true; // false - проверить так и сяк Application.Initialize;
  3. Всем привет! Имеется приложение под винду на VCL (торговый терминал). Возникло желание перевести на FMX для сборки под MacOS (это основная цель). Неделя тестов, мида конвертер и ручное ковыряние и правка кода и вуаля, приложение скомпилировалось:) Однако при первом взгляде на свеже-испеченную прогу меня охватил ужас! Хотя нет, ужас охватил еще раньше, когда в одном из тестов мемо с коротеньким текстом на 2 страницы загрузило ЦПУ на 20% при скролле... Тогда я решил, что вобщем-то мои пользователи редко будут мемо скролить. Но вот общий вид приложения, эти стремные шрифты, несоразмерные кнопочки и тп, едва не отбили желание продолжать:) Теперь от лирики к существу: нужна консультация по вопросу, стоит ли вообще и если да, то какие подводные камни могут еще встретится и как обходить. Дельные консультации, а также практическую помощь (стили, советы, куски кода) готов хорошо оплатить.
  4. Можно, прикладываю. Поставьте в еврике (или FastMM или чем вы пользуетесь?) опцию "Fill released memory with non-zeroes" чтобы сразу увидеть баг. И этот баг - один из множества подобных. И не только подобных)) Если вам никогда не приходилось использовать эврику или другую систему отладки, для вас почти все будет хорошо. Проблемы не видно - значит ее нет:))) "Почти" - потому что, к счастью, FMX дарит и такие глюки, которые видно явно и сразу. Например, ELGridBug.zip
  5. Узнаю в Вас сотрудника Embacaderro, как раз такой подход им и нужен. Кейс заключается вот в этом коде procedure TStyledGrid.HideEditor(const Accept: Boolean); {....} if FInplaceEdit <> nil then FreeAndNil(FInplaceEdit); После которого работает TControl.DoDeactivate с уже удаленным объектом.... Ваш коллега действовал так: - Метод Release больше не используем - да шеф! CTRL-R, Release, Free. - а подумать? - а ну нафит. за подумать тут не платят
  6. Интересно, как вам удается не замечать очевидных багов. Например такой: киньте TStringGrid. Запусти, нажми в ячейку, смени фокус. Наблюдай AV:))) Не видите такого? (P.S. это один из многих, а именно около 25 примеров, известных мне, что там может глючить)
  7. Ошибаетесь в части "вместо действий" Действие тут возможно - зайти на quality.embarcadero.com и описать баг, что я и делаю по мере сил и возможностей. Некоторые баги сами по себе занимают тонну времени, чтобы их найти и описать минимальное демо, например ваш про пошаговое подвисание - у меня такое бывает в Win64 приложении тоже, примерно раз на 100 запусков. Помогает перезапуск студии, даже не представляю, как это отлаживать. А еще последнее время студия (10.2.3) сама собой вылетает, без AV без ничего, просто снимается процесс)) Обычно в начале работы бывает, если первые 10 минут не вылетела то дальше все норм.
  8. так о том и речь вопрос в том, как уволить из embarcadero сотрудников с таким подходом "у меня все гут, значит проблем нет, можно пускать в релиз"
  9. Да хоть два 1) см. первое сообщение этой темы 2) Прикладываю. Угадайте, что на скрине? (подсказка: это панель с TBevelEffect) BevelBug.zip
  10. С одной поправкой - только если железо такое же, как у разработчика FMX
  11. Так а что там читать, просто напишите в dpr файле GlobalUseGPUCanvas := false; GlobalUseDirect2D := true; Application.Initialize; Полагаю, что это не поможет, тогда попробуйте так GlobalUseGPUCanvas := false; GlobalUseDirect2D := false; Application.Initialize; Если это поможет, то дальше надо лезить в исходники FMX.Canvas.D2D.pas ...
  12. А не смущает заливка формы на Вашем скрине? Поздравляю, FMX на вашей системе нормально работать не будет (у моих пользователей так бывает, единственное решение которое я нашел - играть с GlobalUseDirect2D := false). Еще нужно обновить драйвера видяхи, но думаю Вы это и так сделали GlobalUseGPUCanvas тоже может помочь, но вызывает столько новых багов, что лучше не пробовать даже. А так, вообще, если у вас видяха такая же, как у разработчика FMX, то ничего не троит procedure TForm24.Timer1Timer(Sender: TObject); begin Circle1.Position.X := Circle1.Position.X + 1; Circle1.Position.Y := Circle1.Position.Y + 1; end;
  13. Теперь уже я удивляюсь Последний - ну настолько дикий, достаточно всего лишь иметь грид и эврику, и его сразу видно. Просто кинули грид, и вот тебе AV, без единой строчки кода. Существует в 10.2 , в 10.3 в одном месте пофиксили, в другом вылезло))) Платформу делали китайцы за еду натурально, так торопились сдать поскорее и получить паек. Для меня вывод однозначен - очень мало в серьёзных проектах FMX использует, настолько мало, что на quality.embarcadero.com их не видно. Для других, кто пойдет этим путем (перевод приложения с VCL) просьба-совет - Пожалуйста, репортите баги на quality.embarcadero.com, хоть небольшой шанс улучшения ситуации
  14. Nick Peterson

    Abstract error в FMX.Types3D.TContextManager.CreateFromTexture

    Что-то пошло не так:) Куда копать? (вдруг кто взглянет на картинку и поймет, мала вероятность конечно, но а вдруг?:)) Затрудняюсь придумать тест кейс для такого. Обычная менюшка, просто на машине одного юзера почему-то не работает. ))
  15. Да тут баг на баге сидит и погоняет Вот еще в духе этой темы: грид, лайвбиндинг.В Grid1HeaderClick выполняем обновление запроса (например, для сортировки). После этого форма перестает реагировать на мышь)) Уже впадлу багрепорты писать, штук 15 настрочил наверное а то и больше Решил пока через таймер...
  16. Nick Peterson

    10.2 Столбцы с combobox'aми

    И как сделать теперь колонку с кнопками?:))
  17. Nick Peterson

    TMemo для вывода лога тормозит

    Спасибо @slav_z за идею, чуть допилил выделение и контекстное меню, еще бы прикрутить CTRL-C грамотно:) Впрочем уже и так отлично FastMemo.zip
  18. Nick Peterson

    TMemo для вывода лога тормозит

    Ну мое дело предложить:) Посмотрел, в первом приближении то что надо !,Ок, выделение по буквам не нужно, но нужно: 1) выделение при удержании мышки и движении вверх (скроллится должно выше и продолжать выделение) , и так же вниз 2) контекстное меню Copy и CTRL-C Это влезет в 100?)) компонент нужен как класс для рантайма
  19. Nick Peterson

    TMemo для вывода лога тормозит

    Да только перечитайте эту тему, мне надо чтобы в компоненте можно было выделять и копировать текст. Т.е. по сути нужно Memo)) только быстрое
  20. метод Release создавал новый поток для каждого удаления, что как бы не очень правильно. Я сделал костыль через список объектов на удаление + таймер
  21. Затрудняюсь даже правильно сформулировать вопрос:)) Т.к. проблема приходит мне только в отчетах Эврики, повторить пока не удается. Вижу что основной поток (виндовое FMX приложение) виснет где-то в дебрях драйверов, callstack может начинаться на MouseClick (как в примере ниже, тут юзер вызвал контекстное меню) или WM_Paint (в таких случаях вообще ничего не понятно, в колстеке только системный код). На данном скрине приложение зависло. Намертво. Без всяких подозрительных действий со стороны юзера или подозрительных участков моего кода, т.е. похоже что все плохое случается просто при отрисовке формы. Собственно вопрос расплывчатый - куда рыть? кто-нибудь сталкивался? А тут скрин целиком не влезает, разбиваю на 2 В этих двух случаев одно общее - виснет намертво при получении виндового сообщения, различается только класс канвы (аппаратный и программный). Таких примеров полно, т.е. это не просто 2 случая, где-то в среднем на 100 пользователей 1-2 столкнутся с таким зависанием. Еще 1 пример:
  22. Nick Peterson

    TMemo для вывода лога тормозит

    Благодарю! Осталось дописать выделение и копирование текста, и быстрое мемо готово. Странно только, что в Embarcadero еще не сделали этого, наверное слишком заняты новыми темными темами для IDE. P.S. Готов заплатить за такой компонент 100$
  23. Nick Peterson

    Размеры TImage

    Магия указателей?:))
  24. Nick Peterson

    TMemo для вывода лога тормозит

    Позвольте не согласиться:) Виндовое мемо работает в 12 раз быстрее, что видно на моих скринах, используя так же только процессор (на виртуалке где я делаю тесты, видяхи нет). Ага, тоже об этом подумал уже:) Обычный файл + блокнот:) Оставлю это как запасной вариант, но все же тешу себя надеждой, что существует возможность сделать быстрое мемо в FMX, не прибегая к костылям!
  25. Nick Peterson

    Ошибка 887A0006 в TCanvasD2D.DoBeginScene

    Очень редко, не у всех пользователей но все же появляется ошибка в этом месте function TCanvasD2D.DoBeginScene(const AClipRects: PClipRects; AContextHandle: THandle): Boolean; var Res: HResult; begin Res := SharedDevice.GetDeviceRemovedReason; if Res <> S_OK then begin LastDeviceRemovedReason := Res; // <-- 0x887A0006 HandleDeviceRemoved; Exit(False); end; Как мне кажется, это связано с использованием TBitmap.Map, но могу ошибаться. Повторить у себя не удается, вижу только в логах пользователей. После появления такой ошибки все контролы перестают нормально рисоваться, помогает только перезагрузка. Никто не сталкивался?