Nick Peterson

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

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

  • Посещение

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

  1. Всем привет! Имеется приложение под винду на VCL (торговый терминал). Возникло желание перевести на FMX для сборки под MacOS (это основная цель). Неделя тестов, мида конвертер и ручное ковыряние и правка кода и вуаля, приложение скомпилировалось:) Однако при первом взгляде на свеже-испеченную прогу меня охватил ужас! Хотя нет, ужас охватил еще раньше, когда в одном из тестов мемо с коротеньким текстом на 2 страницы загрузило ЦПУ на 20% при скролле... Тогда я решил, что вобщем-то мои пользователи редко будут мемо скролить. Но вот общий вид приложения, эти стремные шрифты, несоразмерные кнопочки и тп, едва не отбили желание продолжать:) Теперь от лирики к существу: нужна консультация по вопросу, стоит ли вообще и если да, то какие подводные камни могут еще встретится и как обходить. Дельные консультации, а также практическую помощь (стили, советы, куски кода) готов хорошо оплатить.
  2. Теперь уже я удивляюсь Последний - ну настолько дикий, достаточно всего лишь иметь грид и эврику, и его сразу видно. Просто кинули грид, и вот тебе AV, без единой строчки кода. Существует в 10.2 , в 10.3 в одном месте пофиксили, в другом вылезло))) Платформу делали китайцы за еду натурально, так торопились сдать поскорее и получить паек. Для меня вывод однозначен - очень мало в серьёзных проектах FMX использует, настолько мало, что на quality.embarcadero.com их не видно. Для других, кто пойдет этим путем (перевод приложения с VCL) просьба-совет - Пожалуйста, репортите баги на quality.embarcadero.com, хоть небольшой шанс улучшения ситуации
  3. Nick Peterson

    Abstract error в FMX.Types3D.TContextManager.CreateFromTexture

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

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

    И как сделать теперь колонку с кнопками?:))
  6. 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 тыс. строк, но и загружено оно помимо вывода лога другими задачами, так что фризы все равно ощутимы.(хотя и не так видны на графике ЦПУ)
  7. Nick Peterson

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

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

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

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

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

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

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

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

    Размеры TImage

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

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

    Позвольте не согласиться:) Виндовое мемо работает в 12 раз быстрее, что видно на моих скринах, используя так же только процессор (на виртуалке где я делаю тесты, видяхи нет). Ага, тоже об этом подумал уже:) Обычный файл + блокнот:) Оставлю это как запасной вариант, но все же тешу себя надеждой, что существует возможность сделать быстрое мемо в FMX, не прибегая к костылям!
  15. 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, но могу ошибаться. Повторить у себя не удается, вижу только в логах пользователей. После появления такой ошибки все контролы перестают нормально рисоваться, помогает только перезагрузка. Никто не сталкивался?
  16. Nick Peterson

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

    Благодарю! Стало чуть понятнее - если добавлять 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
  17. Nick Peterson

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

    мой скрин как бы показывает обратное два приложения, два одинаковых таймера (100мс в данном случае) на добавление строки. Одна и та же машина (2х ядерная виртуалка). 1 скрин FMX приложение, второй VCL 1 потребляет 30-50% CPU второй 6-8% Мне нужен след. функционал: текст, являющийся логом и позволяющий промотать хоть немного вверх и скопировать любую.часть себя. Сейчас я ограничил до 300 строк, и с учетом убирания вот этого кода фризы ушли. Юзеры конечно недовольны, что для просмотра остального надо жать дополнительные кнопки.. Позвольте пока считать вопрос открытым, может у кого есть на примере компонент или идеи с функционалом , описанным выше
  18. Nick Peterson

    Постоянная потеря фокуса под Wine

    Было похожее, правда только с окном в состоянии fsStayOnTop Временно решил так, пока разбираюсь с более серьёзными глюками платформы)) procedure TPumpHelper.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); begin If Visible and not Active then Show; end;
  19. Nick Peterson

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

    специально же приписал в конце, зачем:)) Вопрос конечно же не в том, "как сделать TMemo на 100 000 строк" Вопрос в том, почему TMemo на 100 000 строк так сильно лагает. TMemo на 1000 стрк тоже лагает, просто не так сильно, чтобы показать это наглядно на скрине, я не знаю как наглядно аргументировать пост на форуме "TMemo на 1000 строк лагает". В приложении это чувствуется по отзывчивости UI как микрофризы. Они частично лечатся выкидыванием кода как на скрине выше. Именно с этими микрофризами я пытаюсь бороться, при этом сохранив возможность видеть лог в виде текста (почему не в БД? потому что запись в БД ведется параллельно, она не лагает и с ней вопросов нет. Но нужно еще и дать пользователю видеть все последние события и иметь возможноть отмотать выше на N-Ное время для сравнения, и вот в этой части как раз вопросы есть). А вот мемо на 100 000 лагает так, что это прекрасно видно на графике загрузки ЦПУ, я считаю что это не нормально, поскольку такое же видновое мемо ведет себя совершенно иначе. Значит, это возможно , парням из майкрософта удалось это сделать!:)) Интересно, как...
  20. Реализация 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;
  21. Как сделать чтобы мемо не рисовало кусочки строки, которая не влезла целиком ? (Line 2 в примере на скрине)
  22. Супер! Спасибо, почти идеально стало. Кроме случаев, когда мы уперлись в самый низ))
  23. Что делать: находить способы исправления системных глюков и багов FMX (т.е. содержащихся в исходниках FMX) Оплата: разовые оплаты в зависимости от сложности. Пример: в теме ниже описано 6 "фишек", за все 6 плачу 500$. За решение вопроса со шрифтами на D2D канве еще 300$. Возможны иные варианты оплаты, пишите ваши предложения в личку. (скрин с иллюстрацией проблемы шрифтов ) Возможно дальнейшее сотрудничество (править глюки платформы - это не самоцель разумеется, а вынужденная необходимость)
  24. Что-то желающих немного, поднял ставки:)
  25. Nick Peterson

    Тормоза ScrollBox и TScene

    Возможно это два разных вопроса, и я зря объединил их 1) Как ускорить ScrollBox? Например, берем грид и начинаем его быстро скроллить вверх-вниз. Для чистоты эксперимента я проверяю на 1-ядерной виртуалке, скоролл жрет 50% ЦПУ. Насколько я понял, так происходит потому, что скролл не использует буфер и отрисовывает каждый раз всю область заново, причем именно на каждое событие мыши 2) Дальший поиск в гугле привел к TScene https://github.com/eugenekryukov/TScene , инфа о которой крайне скудна, пример выглядит круто, но я не понял, как использовать в боевых условиях ? и в каких именно случаях он помогает, например можно ли решить вопрос N1 с его помощью?