powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевод приложения на мультиплатформенность.
68 сообщений из 68, показаны все 3 страниц
Перевод приложения на мультиплатформенность.
    #39336554
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все это делается только для фана. Образования специального нет, погромистом нигде не работал.
Delphi Seattle. Из обвесов DDev и EurekaLogs 7.4 (кстати вот за эту я бы заплатил, оно того стоит. Может и куплю в итоге, 150$ не такие большие деньги. А вещь реально отличная).

Моего кода - 320к строк, включая PAX.

Все это бодро и весело крутится под вин, баги вылавливались годами, практически не осталось их - стало скучновато. Задумался про мультиплатформенность. Первым пойдет в ход андроид - с ним проще всего, и эмуляторов рабочих полно, и у меня несколько реальных девайсов под руками разных версий - вобщем есть где тестить. С тем же иосом куда сложнее будет.

В двух словах текущая архитектура приложения:
Есть ядро, не привязанное ни к чему - логгер, конфиги, скрипты (внутренние и внешние), простейший кешер, абстрактная сетевая часть.
Есть надстройки под конкретные игры - дочерние классы, перекрытые классовые методы, сетевая часть, кешер, добавленные скриптовые методы и все такое.

Сначала я без спешки где-то год разделял тот монолит, который у меня был на ядро + надстройка. Попутно максимально отделял от основной части приложения логгер, скрипты и прочее - вобщем делал то, что по-хорошему изначально должно было быть. Попутно, начитавшись рекомендаций по переходу на малтиплаформенность от ЕМ, убирал явные косяки в коде - обращение к символу строки по индексу и прочее такое очевидное.
В это же время был переезд с PascalScript на Pax, именно из-за мультиплатформенности пакса, но этот ад достоин отдельного поста, потом распишу подробнее.
На этом этапе я еще не выносил код гуя из юнита формы в отдельный юнит, про это тоже позже.

Потом, на удивление легко и просто, через пару дней допиливания напильником скомпилировалось ядро под андроид. Пока только скомпилировал, ничего не запускал.
Споткнулся разве что об WaitForMultiple - работает только в Win, и это была большая засада.
Сделал банально:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  while (not Terminated) and Char_Started do
  begin           
    try
      WR := FEvents.WaitFor(10);
      case WR of
        wrTimeout : CommonTimerProc;
        wrSignaled: ExecEvents;
        wrAbandoned,
        wrError:    Break;
      end;
    except
      on E : Exception do
      begin
        ShowMessageMultiplatform(E.ClassName + ' : ' + E.Message);
        Break;
      end;
    end;
  end;


а в CommonTimerProc (который в дочерних классах перекрывается при нужде) перебирать уже всё.



Взялся за надстройку.

Из того, что явно запомнилось по коду:
1) Как я уже писал пару недель тому в соседней теме - Не надо использовать System.ByteString. Вообще. У меня вдруг после включения этих байтстрингов в десятка полтора юнитов в одном месте вылетела ошибка что-то там, мол приложение скомпилировано с неправильной версией юнита variants, хотя я таким не баловался никогда. Гугл не помог. Отказался от System.ByteString - и все нормально стало, хотя ByteStrings были для сиэттла.
Правильный, но тяжелый путь - переводить все на юникод. Для анси использовать
//bytes := TEncoding.ANSI.GetBytes(str); и //str := TEncoding.ANSI.GetString(bytes);
Вначале кажется, что оно неприменимо везде никак, все равно мол. останется куча мест. Ан нет, в итоге перекрыл все ими. Приноровиться надо, тогда все просто оказывается :)
2) Перевод всех TList; на TList<X>; Их было очень много (только в одном юните около 30). Особенно навеселился с компараторами. Но сделал. Оно конечно можно было бы не трогать, это (пока?) лишь warnings, но когда их столько - начинает напрягать.
3) Классическое TStringList.Add('xxx',TObject(some_record)); перевел все структуры в классы, нормально.
4) от ZEROBASEDSTRINGS, настоятельно рекомендуемого ЕМ, я отказался - делать аудит ВСЕГО кода я охренею. Это добавило чуток сложностей в плане того, что надо все время держать в памяти, что в стрингхелпере оно включено, а у меня нет - но это некритично.
5) куча всяких мелочей, типа неподдерживаемого ZDecompress с указателями в параметрах (оставили только с TBytes) и прочее.

Явно что-то забыл, спрашивайте.



Про FMX позже.

P.S. У нас тут суета и паника, уже завтра-послезавтра могут всех домой отправить, так что не до интернета несколько. Зима пришла на месяц раньше ожидаемого :(
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336573
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

софт-то что делает в общих чертах?
Только для внутреннего потребления?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336579
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миграция PascalScript => Pax.

PS, при всей его вылизанности - увы, не поддерживает ничего кроме Win в принципе. Пришлось переходить на Pax.
Ну и плюс Пакс поддерживает хелперы, классы в коде, overload, default param и прочее. Да и сам по себе движок очень мощный.

Вначале, прочитав что PaxProgram (компилятор в байт-код) работает намного быстрее, чем PaxInterpreter - начал заниматься им. Багов там не то, чтобы много - их там невероятное кол-во. Я вылизывал его две недели, и все равно, новые всплывали без конца и края.
Почему я сразу не стал использовать PaxInterpreter, который, собственно, и есть мультиплатформенный - вопрос без ответа.
В итоге перешел на него. Скорость поменьше, чем у PaxProgram - но мне с головой хватает. Багов, по сравнению с PaxProgram - крайне мало, и те скорее из-за невозможности протестировать автором всё. Вообще у меня сложилось ощущение, что с какого-то момента все внимание автора пакса уделялось только PaxInterpreter, а разработка PaxProgram была прекращена, а сам движок пакса развивался, фичи добавлялись - оттуда и все эти баги. Так, в комлекте идет, но работать с ним почти невозможно.
В PaxInterpreter'е тоже багов хватало, и потери от кривого перевода типов, и неправильное освобождение строк, а работа с массивами - это вообще что-то.

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

На текущий момент исправлено все, что было обнаружено. Остался мутный баг, когда скриптов запущено больше одного на приложение - рано или поздно начинаются проблемы - ошибки, AV, фризы - вобщем классическое повреждение памяти где-то. Проявляется долго, поэтому буду ловить уже когда буду дома.

Впилил в него полноценную отладку - получение и установку переменных, полей классов и структур и прочее, прочее. Где-то в соседних темах показывал скрин редактора в момент отладки.

Из поддерживаемых языков - VB работает так же хорошо, как и паскаль.
А вот JS сырой. Совсем сырой, от кривых массивов, до отсутствия подхвата-на-лету строк вида '{Count: 1, Items: [{ClilocID: x, Params: [''str1'', ''str2'']}]}'. А кому оно в таком обрезанном виде надо?



P.S. Это кстати вторая попытка впихивания пакса, удачная. Первая была года 3 тому, но неудачно. Багов было больше, знаний меньше.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336583
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanVizit0r,

софт-то что делает в общих чертах?
Только для внутреннего потребления?

Скриптовый клиент для игр. Т.е. никакой графики вообще.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336584
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rwadmanVizit0r,

софт-то что делает в общих чертах?
Только для внутреннего потребления?

Скриптовый клиент для игр. Т.е. никакой графики вообще.

Поправлю себя - графика есть. В UO-надростойке вычитываются дата-файлы игры, и в одной из вкладок рисуется простейшая 2д-карта, по ней удобно бегать и вообще понимать что и где.
Вот собственно и вся графика.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336619
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про FMX.

В Seattle его уже хоть как-то, пусть с оговорками, но можно использовать. До этого пробовал XE7 - все было уныло начиная уже со старта.

Из больших подводных камней:

1) Самый большой, встреченный мною - это TBitmap. В VCL ты спокойно задаешь pixelformat и вперед. А в FMX так нельзя. Там нельзя задать pixelformat вообще, он задается сам в зависимости от движка отрисовки. А даже если бы можно было (до XE8, насколько помню) - pf15bit там вообще нет. И вот фиг знает что мне делать, конвертировать 800 мб арта в 32б формат меня как-то не радует.
А по остальному - пикселы мапятся, и через GetScanline читаются.

Пользуясь случаем - никто не встречал на своем пути сторонних мультиплатформенных классов по работе с графикой, и чтоб бм поддерживала? гугл не признается.

2) Неплохой набор подводных камней сидит в стандартных компонентах. Например для TEdit и TComboBox нельзя сделать высоту меньше чем 32, оказывается это фича такая.
Лечение тоже в духе FMX
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  TEdit = class(FMX.Edit.TEdit)
  protected
    procedure AdjustFixedSize(const Ref: TControl); override;
  end;
...
procedure TEdit.AdjustFixedSize(const Ref: TControl);
begin
  SetAdjustType(TAdjustType.None);
end;

.
Да и шрифт в TComboBox так просто не изменишь, но это уже мелочи.
А вот то, что у TComboBox отсутствует ивент OnSelect - это уже не мелочи. Теперь приходится при операциях с ComboBox ставить OnChange в nil, потом возвращать обратно. Та же история с CheckBox, кстати.
Измененные названия проп типа Caption\Text - это ерунда. Правильно поменяли, кстати. А то эти пропы с типом "TCaption" меня всегда напрягали.

Загрузку из ресурсов я еще не успел проверить.

Нет OwnerDraw у айтемов листбокса - это сделало мне большую печаль. Вроде есть варианты, но там тоже не так все гладко. Но хотя бы направление движения есть - буду копать.

3) Попереименовывать все цвета в TColors.XXX (напр. TColors.Green) - невелика проблема.

Так сходу из общих проблем FMX ничего не вспоминается.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336621
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rПользуясь случаем - никто не встречал на своем пути сторонних мультиплатформенных классов по работе с графикой, и чтоб бм поддерживала? гугл не признается.Graphics32 не катит разве?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336627
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatVizit0rПользуясь случаем - никто не встречал на своем пути сторонних мультиплатформенных классов по работе с графикой, и чтоб бм поддерживала? гугл не признается.Graphics32 не катит разве?
качну, посмотрю что там, спасибо.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336632
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FMX применительно к Андроиду.

Мне вот надо, чтоб приложение работало только в landscape режимах - обычном и перевернутом. Portait - нафиг.
И вот идешь в опции проекта, там смотришь в Application-Orientation, включаешь, выбираешь 2 нужных галки. Вроде все классно и очень просто. Вот только не работает. При повороте приложение все равно хочет повернуться в portrait и тупо крашится.
А работает как надо только при сочетании двух вещей -
1)
в .dpr проекта сразу после
Application.Initialize;
добавить
TAndroidHelper.Activity.setRequestedOrientation(TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
ну и
Androidapi.Helpers,
Androidapi.JNI.App,
Androidapi.JNI.GraphicsContentViewText,
в uses

2) в файле AndroidManifest.template.xml поменять android:configChanges на
android:configChanges="orientation|keyboard|keyboardHidden|screenSize" .

Второй фикс - для решения вопроса краша при повороте, первый - для использования только двух landscape режимов.


Радует, что в Сиэттле "изкаропки" нормально работают в андроиде контролы, получающие фокус, раньше в андроиде 5 вешали приложение наглухо.

Из интересных моментов - вот есть в FMX классические Open\Save dialogs. Все отлично вроде как. Вот только на андроиде никакого диалога не показывает, а сходу возвращает False. Почему было не реализовать его при наличии всех необходимых апи - то вопрос вопросов. Причем ЕМ про этот факт скромно забыло упомянуть в инфе про диалоги. Впрочем, в инете народ уже выложил несколько вариантов, потом буду смотреть, что там да как.

Вообще разработка гуя, или фикс чего-то в андроиде - это отдельная песня, причем очень грустная. Это в VCL просто - поменял, запустил, посмотрел результат, закрыл и по кругу. В Андроиде, когда компиляция + deploy + запуск приложения занимает минуты по 3 (на i7-то!) - разработка превращается в нечто невероятное.
После нескольких экспериментов оказалось, что никакого выигрыша в скорости при использовании андроид-эмуляторов нет, с реальным получается быстрее всего.

Еще вспомнилось "двойное завершение" приложения, когда при закрытии оного происходит двойной заход в деструктор главного окна. Причину я так и не понял, корни уходили в глубину явы, так что поставил простой семафор и забыл.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336639
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rЕще вспомнилось "двойное завершение" приложения, когда при закрытии оного происходит двойной заход в деструктор главного окна. Причину я так и не понял, корни уходили в глубину явы, так что поставил простой семафор и забыл.
Не в яву, а в FMX, который бинарником идет в apk.
Там мрак полный, вплоть до того, что явно рубят по версии андроида и прочим атрибутам.
Ощущение, что сделано осознанно и специально для покупки следующих версий делфи.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336642
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на текущий момент:
1) приложение запускается, все настройки подхватывается, к серверу подключается нормально, (по отзывам нескольких юзеров скорость такая же как и на компе - 1-2с на коннект. Здесь же интернет через спутник - коннект может и полминуты идти), скрипты запускаются.
2) Для полноценной работы всех дата-файлов надо впилить класс MMF для андроида - сейчас 5 юнитов из 13 фактически отрезаны.
3) разобраться с битмапами
4) опен-диалоги и прочее, это уже текучка.

Вот как-то так.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39336985
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
было чуть времени, заценил 2 реализации списка каталогов\файлов - одну на основании банального TDirectory.GetDirectories и TDirectory.GetFiles, вторую на основании крохотного java-класса. Вторая чуть быстрее, но чувствуется это только на реально больших списках - напр. 200 фоток через дельфийские методы получал чуть-чуть дольше, чем через ява-класс. Мне такие каталоги не нужны, а значит можно сказать что скорость одинакова.
А вот с импортом все оказалось намного сложнее. Надо прицепить .jar, в деплоймент прицепить все нужные файлы от него, правильно прописать им RemotePath. В офиц. инструкции все красиво и легко - просто импортируйте все нужные файлы в проект. всё.

Итог - использую самописный список, на основе первого варианта. К нему и фильтра дописать можно и вообще настроить как хочется.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337059
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

к слову, лазарь не рассматривается в качестве платформы для сборки совсем? он там вроде под андроид что-то мог. fmx'а нет, lcl - нечто типа vcl, может перевести проще будет?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337146
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

незнаю как сейчас, но года два тому свежеустановленный лазарь, начавший сыпать тонны ошибок на компиляции пустого проекта - вызвал у меня неудержимое желание удалить его и забыть навсегда. Да и размер итогового приложения, 40 мб под винду если не изменяет память - вообще не радует. Под андроид наверное не меньше получается.

А насчет андроидного варианта - да вобщем-то мне и FMX подходит, тем более что он не только под андроид идет. Размер они по сравнению с первыми версиями FMX уменьшили, скорость работы вобщем-то пристойная - пока что все устраивает.




Сегодня кстати выложу скриншотов, как закончу делать ownerdraw для listboxItem.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337172
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

:) всё так жестко было? 1.7 (транковый) точно так не делает. 40 мб - в дебаг режиме. если без - размер будет меньше.

авторПока что все устраивает

Если работает - то отлично! Показывайте, рассказывайте. LCL, к слову, тоже везде работает.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337314
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonVizit0r,

:) всё так жестко было? 1.7 (транковый) точно так не делает. 40 мб - в дебаг режиме. если без - размер будет меньше.

авторПока что все устраивает

Если работает - то отлично! Показывайте, рассказывайте. LCL, к слову, тоже везде работает.

ага. Поэтому я его вообще не рассматривал в кач-ве альтернативы.
Когда-то потом может от нечего делать опробую, но не сейчас.

Через пару часов буду на работе и скину скринов.



P.S. Рисование на канвасе в FMX отличается от VCL, но ничего такого абсолютного иного. Хелп + примеры нормально помогают. Самый сложный момент оказался с цветами - там TAlphaColor используется, который есть $FF or TColor. Сразу не обратил внимания - и не мог понять, чего это ничего не рисуется. А оно просто прозрачное всё было.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337344
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rСкриптовый клиент для игр. Т.е. никакой графики вообще.
А что за игра?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337355
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Vizit0rСкриптовый клиент для игр. Т.е. никакой графики вообще.
А что за игра?

основная - это та, под которую упор делается, есть много народу, который приложением пользуется (и тестит, соответственно) - это Ultima Online.

Так-то переделывалось и под Perfect World, и под несколько VK игр - еще до разделения на ядро и игровую надстройку.
Уже несколько заявок есть на другие игры, но пока не до них.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337395
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два скрина - вин и андроид.
Эти цветные полоски убивают тонну времени - я часа два потратил на то, чтобы правильно подобрать их положение. И то не до конца, но это уже мелочи. Да и цвета явно не те, что должны быть - виндовые цвета на андроиде извратились до совершенно других. Пока взял Red Blue Green, потом подберу покрасивее.



...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337396
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а черт, 2 скрина с нета под спойлером, и еще 1 приложился файлом - продублировался.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337406
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в FMX, в отличие от VCL, для TListBox в событии OnClick еще старый ItemIndex листбокса. Новый установлен дальше, ловить можно в OnItemClick.

один из мелких незаметных моментов, которые при этом могут осложнить жизнь.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337443
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С таким стилем и сложностью интерфейса проще было бы все на FMX сделать.

ИМХО.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337446
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) размер - 52 мб exe - как-то меня не очень радует. Против 13 VCL.
2)В редакторе много чего чисто VCL-ного задействовано.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337465
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовал отказаться от Memory mapped files в пользу обычного TFileStream - получил на винде при просчете маршрута замедление в три раза.
Пришлось на коленке состряпать порт MemMapFile на Posix

Код: 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.
constructor TMMFStream.Create(_FileName : String);
begin
  inherited Create;
  FMemory := nil;
  FFileName := _FileName;

  FSize := GetFileSizeByFileName(_FileName);
  // Open the file
  FileHandle := Fileopen(_FileName, fmOpenRead + fmShareDenyNone );

  if FileHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;

  // Map it!
  FMemory := mmap(nil,FSize,PROT_READ, MAP_SHARED,FileHandle,0);

  if FMemory = Nil then RaiseLastOSError;
end;

destructor TMMFStream.Destroy;
begin
  if FMemory <> Nil then
    if munmap(FMemory, FSize) <> 0 then
      RaiseLastOSError;
  inherited Destroy;
end;


остальное вроде не меняется.

все оказалось проще, чем казалось сначала.

потом проведу тесты на андроиде, чтобы сравнить время.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337481
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

эх..., ностальгия ... сколька драйва, когда выходишь на ещё непроверенном, только написанном клиенте

LCL - да, неплохо рулит, сам свой клиент переписывал. Правда мой для ещё более древних игр

а Мапер на каком принципе сделан? я сам до мапера не добрался
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337906
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rпопробовал отказаться от Memory mapped files в пользу обычного TFileStream - получил на винде при просчете маршрута замедление в три раза.Сейчас сам изучаю этот вопрос. Если общаться с TFileStream блоками по 8192 байт, то замедления нет
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337940
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Если общаться с TFileStream блоками по 8192 байт, то замедления нет

....но тогда теряется и преимущество TFileStream перед MMF
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337951
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Vizit0rпопробовал отказаться от Memory mapped files в пользу обычного TFileStream - получил на винде при просчете маршрута замедление в три раза.Сейчас сам изучаю этот вопрос. Если общаться с TFileStream блоками по 8192 байт, то замедления нет
Нет ли совпадения с размером кластера?

Может тогда проще написать наследника с буферизацией по размеру кластера?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337960
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch....но тогда теряется и преимущество TFileStream перед MMFНе теряется. Потребление памяти меньше
wadmanНет ли совпадения с размером кластера?Нет. Что удивительно. У меня максимальная скорость была на буфере 8К при кластере 4К.

Таки выложу я результаты своих изысканий. Ближе к вечеру
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337968
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дельфях нынче есть TBufferedFileStream.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337971
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До берлина он был TFDFileStream в FireDAC.Stan.Util.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337972
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВ дельфях нынче есть TBufferedFileStream.
Размер буфера с потолка берет?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337974
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВ дельфях нынче есть TBufferedFileStream.XE3 - нет
rgreatДо берлина он был TFDFileStream в FireDAC.Stan.Util.FireDAC не покупали
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39337975
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из конструктора. По дефолту 32768.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39338015
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня нет такого, что надо вычитывать большие файлы подряд. С этим я уж разобрался бы, читал бы большими кусками и все такое.

У меня обращение к кускам внутри больших файлов по конкретным адресам - 40 байт там, пару десятков байт там, сотня тут.

Примерно в таком формате:

Код: pascal
1.
2.
3.
4.
  TMapBlockArray = array[0..0] of TMapBlock;
  PMapBlockArray = ^TMapBlockArray;

  Block.MapBlock := @PMapBlockArray(mapStream.Memory)[Block.BlockID];



Код: pascal
1.
2.
3.
4.
5.
  TIndexRecordArray = array[0..0] of TIndexRecord;
  PIndexRecordArray = ^TIndexRecordArray;

  IndexRecord := PIndexRecordArray(StaIdxStream.Memory)[Block.BlockID];
  Block.StaticBlock := StaMulStream.Offset(IndexRecord.Offset);



Т.е. обращение к mapped файлу как к массиву.

Именно про эти два куска я писал, что менял их на TFileStream (Seek&Read) - и получил падение скорости в три раза.
Подозреваю что тут тот самый редкий случай, когда ММФ действительно нужно, и нормальной альтернативы нет.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39338082
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rу меня нет такого, что надо вычитывать большие файлы подряд.MMF именно это и делает выделяет буфер под весь файл (если Вы мапите сразу все), считывает файл в этот буфер и отдает его Вам
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39338217
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Vizit0rу меня нет такого, что надо вычитывать большие файлы подряд.MMF именно это и делает выделяет буфер под весь файл (если Вы мапите сразу все), считывает файл в этот буфер и отдает его Вам

почитал мсдн, подумал.

Попробую сделать заново кешер, который там когда-то был, но несколько лет тому был выпилен почему-то. Надо по коммитам посмотреть, что там и как было. Может расход памяти большой, может неэфективность - надо смотреть.

Там файлов, которые мапятся- в сумме на 500 мб и больше.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39342169
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добрался домой, пришел в себя и занялся делом.

Сделал конвертирование из 15битного формата в полноценный FMX RGBA 32б. Андроид по традиции преподнес сюрпризов с отрисовкой.
Вот один из них:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
{$IFDEF HAS_FMX}
function Color16ToAlphaColor(C : Word) : TAlphaColor;
begin
  {$IFDEF ANDROID}
  TAlphaColorRec(Result).B := ((C shr 10) and $1F) * 8;
  TAlphaColorRec(Result).R :=  (C         and $1F) * 8;
  {$ELSE}
  TAlphaColorRec(Result).R := ((C shr 10) and $1F) * 8;
  TAlphaColorRec(Result).B :=  (C         and $1F) * 8;
  {$ENDIF}

  TAlphaColorRec(Result).G := ((C shr 5)  and $1F) * 8;
  TAlphaColorRec(Result).A := $FF;
end;
{$ENDIF}


Другой момент - это когда присваиваешь одному битмапу другой, потом на первом рисуешь Rect - а он в тех местах, где пиксели непрозрачные - не отрисовывается. Выкатил на fire-monkey.ru вопрос, может опытные люди подскажут.
Еще всякое-разное с андроидом было, с размерами TImage, выводом изображения на него и прочее.

По коду добавил кучу дефайнов, потому что неожиданно повсплывало в куче мест \ в конце\середине пути, да и вообще много где были прописаны абсолютные пути. Все это переносится на общие переменные.

posix-mmf работает, но пока проверял только на единичных обращениях к файлу, на днях начну полноценный тест сложных систем типа поиска пути, там как раз это все будет - и нагрузка на процессор, и обращение к файлам.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39342173
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл упомянуть еще момент.
Tbitmap -
задаешь размеры, затем
Result.Map(TMapAccess.Write,BitmapData);
затем в цикле
P := BitmapData.GetScanline(Y);
и заполняешь только те пиксели, которые используются.
И получаешь сюрприз, что в незаполненных пикселях мусор. И пофиг, что сразу после задавания размера ты делал
Result.Canvas.Clear(TAlphaColorRec.Null);

Зло где-то в районе Result.Map, я не копал глубоко, да и конкретное место неинтересно.

Приходится в каждой итерации делать

P := BitmapData.GetScanline(Y);
FillChar(PCardinalArray(P)[X], Width * SizeOf(TAlphaColor), 0);
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39342272
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

Там по-старинке FillRect не работает?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39342282
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vizit0rИ получаешь сюрприз, что в незаполненных пикселях мусор.
Похоже, это такая оптимизация, FM в режиме "только запись" не гоняет картинку из видеопамяти, считая, что она всё равно будет полностью перезаписана.
Можно использовать TMapAccess.ReadWrite, хотя очистить картинку FillChar-ом наверняка будет быстрее.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39342330
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SaperskyVizit0rИ получаешь сюрприз, что в незаполненных пикселях мусор.
Похоже, это такая оптимизация, FM в режиме "только запись" не гоняет картинку из видеопамяти, считая, что она всё равно будет полностью перезаписана.
Можно использовать TMapAccess.ReadWrite, хотя очистить картинку FillChar-ом наверняка будет быстрее.

это логично, и это первое о чем я подумал.
Только вот....
Код: pascal
1.
2.
3.
    {$IFDEF HAS_FMX}
    Result.Map(TMapAccess.ReadWrite,BitmapData);
    {$ENDIF}




:)

авторТам по-старинке FillRect не работает?
там по-старинке почти ничего не работает, все изменено. Но более-менее логично, примеры и справка + чтение FMX сурсов нормально помогают.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39344654
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может кто-то в курсе - есть ли какая-то возможность под андроид получить инфу о memory corruption ДО того как андроид вышибает со стеком, в котором фигурирует :F6EAF8AC __bionic_heap_corruption_error и прочее такого плана?
Overflow checking + Range checking не помогает.
Ошибка повторяема, проблема где-то в дельфо-андроидных конвертациях PAX'а больших структур (> 4б) при вызове из скрипта внутреннего метода приложения. Знаний, чтобы понять что там не так - явно не хватает. Если проблему структуры размером 3б я решил по аналогии с проблемами структур пакса еще для винды, то в случае большой структуры так уже не катит. Там вовсю работают конструкторы-деструкторы, фиг поймешь что и где не так.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39344877
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rДва скрина - вин и андроид.
Эти цветные полоски убивают тонну времени - я часа два потратил на то, чтобы правильно подобрать их положение. И то не до конца, но это уже мелочи. Да и цвета явно не те, что должны быть - виндовые цвета на андроиде извратились до совершенно других. Пока взял Red Blue Green, потом подберу покрасивее.





Бывший GM Quaid с Age of Power приветствует тебя :)
Я написал первую в мире "ходилку" под Стелс, в 2006 году.
Смотрю, клиент сильно изменился с тех пор.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Перевод приложения на мультиплатформенность.
    #39567215
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этой неделе было время свободное, занялся андроидной версией.


1)с удивлением узнал, что в стандарном сете иконок для андроида нет сохранения. вообще. Что-то похожее еще примерно похожее на открыть есть, а для сохранения нет.
Нашел в полном наборе materials ( https://material.io/icons) иконку сохранения, попробую ее на досуге впилить в стиль.

2) Долго ругался на вызов файлдиалога. Благодаря тому, что с какой-то версии FMX не поддерживает ModalWidows, все действия после вызова файлдиалога пришлось переносить в коллбеки. Особенно классно выглядит это, когда в одной цепочке может быть несколько вызовов файлдиалога, например при открытии файла запрос на сохранение измененного с файлдиалогом для выбора куда сохранить, а потом за ним опендиалог.

3) на удивление легко и правильно завелись Notifications. Неожиданно.

4) поимел вдоволь секса с попыткой сделать редактирование в android-style, когда при редактировании строки или поля оно взлетает наверх, чтобы было видно при открытой виртклаве. Так вот, сделать это легко и просто получается только для TEdit. Для TMemo - все сложно, оно-то наверх прыгает, но при этом верхняя часть уходит за экран. Долго и нудно возился, пока не сделал в лоб - при показе VK меняю layout с tmemo стиль alTop и выставляю нужный Height.
Пробовал и примеры из дельфийского набора, и vkbdhelper.

5) довеском про tmemo - большие проблемы с лонг-тапом и тем, что из него вытекает. Меню показывается, но если нажать на кнопку в появившемся меню или попытаться изменить область выделения - отличный шанс вылететь с невнятной ошибкой в потрохах переходников явы. Пришлось отключить LongTap, но все равно при желании можно получить краш. Что-то там сильно неладно в потрохах. Надо спросить на fire-monkey.ru, может у кого есть решение.

6) андроид 8 походу еще не поддерживается - приложение деплоится, работает нормально, но при этом среда виснет на Launching Application. Т.е. отлаживать на 8 дроиде не получится.



P.S. Кстати, после покупки нового домашнего компа с i5 на борту - компиляция под андроид перестала быть чем-то смертельным, когда можно ставить на компиляцию и уходить кушать, курить и пить кофе. Ощутимо дольше, чем VCL, но уже можно жить. Тот случай, когда проц действительно имеет значение. Знал бы, что будет такой эффект - может и на i7 бы разорился.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39567277
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r...после покупки нового домашнего компа с i5 на борту...
Небось и памяти не меньше 4х гигов натолкал, буржуй?
...что же у тебя в старом компе было?
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39567359
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по нынешним временам мало - всего 8 гб. Но я в игры не играю, мне больше точно не надо.

А до этого был какой-то целерон убогий и 2 гб памяти. Старый комп тогда сгорел, денег небыло, пришлось покупать все самое дешевое. Ноут быстрее работал, чет это убожество.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39567367
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДVizit0r...после покупки нового домашнего компа с i5 на борту...
Небось и памяти не меньше 4х гигов натолкал, буржуй?
...что же у тебя в старом компе было?
Шутки шутками, но, например, топовые i5 последнего поколения чуть-ли не в два раза быстрее моего i7 второго поколения (2600), при этом они в ~2 (и более) раза дешевле современных i7 (в зависимости от модели).
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39567368
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rпо нынешним временам мало - всего 8 гб. Но я в игры не играю, мне больше точно не надо.
Как раз играм-то 8 за глаза, а вот чтобы пару виртуалок одновременно крутить - желательно уже минимум 16. Хотя у всех свои задачи.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39567376
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rпо нынешним временам мало - всего 8 гб. Но я в игры не играю, мне больше точно не надо.

А до этого был какой-то целерон убогий и 2 гб памяти. Старый комп тогда сгорел, денег небыло, пришлось покупать все самое дешевое. Ноут быстрее работал, чет это убожество.

Все правильно. Комп разработчика должен быть говенным: если софтоизделие запустилось, значит, на нормально компе точно работать будет.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39567386
под ван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpчччДпропущено...

Небось и памяти не меньше 4х гигов натолкал, буржуй?
...что же у тебя в старом компе было?
Шутки шутками, но, например, топовые i5 последнего поколения чуть-ли не в два раза быстрее моего i7 второго поколения (2600), при этом они в ~2 (и более) раза дешевле современных i7 (в зависимости от модели).
Вот ты будешь удивляться, наверное, когда и всё остальное 2-го поколения будешь сравнивать с 6-м, а то и вовсе с 8-м поколением
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39567393
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, тут удивление обосновано: до последнего поколения рост быстродействия у процессоров одного уровня был 5-7%, а перед последним пришел живительный пендель от AMD, в результате которого количество ядер в i5 выросло в 1.5 раза (с 4 до 6).
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593019
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня споткнулся, что приложение на андроиде не кушает некоторые ини, созданные в виндовой версии. Оказалось, что из-за того что default Encoding в винде ANSI, а там UTF8 - ломалось при чтении. Пришлось принудительно и там и там задать TEncoding.ANSI.






может кому пригодится - исходник с MMF под Win и Android в одном флаконе.

Source
Код: 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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
unit MemMapFile;

interface

uses
  {$IFDEF MSWINDOWS}
  Winapi.Windows,
  {$ENDIF}
  {$IF Defined(NEXTGEN) AND Defined(POSIX)}
  Posix.Unistd,
  {$ENDIF}

  System.Classes, System.SysUtils;

type
  TMMFStream = class(TStream)
  private
    FileHandle : THandle;
    {$IFDEF MSWINDOWS}
    MapHandle : THandle;
    {$ENDIF}
    FMemory : Pointer;
    FSize : Int64;
    FOffset : Integer;
    FFileName : String;
  public
    constructor Create(_FileName : String);
    destructor Destroy; override;
    function Read(var Buffer; Count : Longint) : Longint; override;
    function Write(const Buffer; Count : Longint) : Longint; override;
    function Seek(Offset : Longint; Origin : Word) : Longint; override;
    function Offset(Offset : Longint) : Pointer;
    property Memory : Pointer read FMemory;
    property Size : Int64 read FSize;
    property FileName : String read FFileName;
  end;


implementation

{$IFDEF MSWINDOWS}
procedure RaiseKnownWin32Error(RetVal : Integer);
var
  Error : EOSError;
begin
  if RetVal <> ERROR_SUCCESS then
    Error := EOSError.CreateFmt('Win 32 Error %d:%s', [RetVal,
      SysErrorMessage(RetVal)])
  else
    Error := EOSError.Create('Unknown Win 32 error');
  Error.ErrorCode := RetVal;
  raise Error;
end;

function Win32CheckKnown(Error : Integer) : Integer;
begin
  if Error <> ERROR_SUCCESS then RaiseKnownWin32Error(Error);
  Result := Error;
end;
{$ENDIF}

function FileSizeByName(const AFilename: String): Int64;
begin
  Result := -1;
  if (not FileExists(AFilename)) then
    Exit;
  // the other cases simply return -1 on error, so make sure to do the same here
  try
    with TFileStream.Create(AFilename,fmOpenRead or fmShareDenyNone) do
    try
      Result := Size;
    finally
      Free;
    end;
  except
  end;
end;

constructor TMMFStream.Create(_FileName : String);
begin
  inherited Create;
  FMemory := nil;
  {$IFDEF MSWINDOWS}
  MapHandle := 0;
  {$ENDIF}
  FileHandle := INVALID_HANDLE_VALUE;
  FFileName := _FileName;

  FSize := FileSizeByName(_FileName);
  if FSize <= 0 then Exit;

  {$IFDEF MSWINDOWS}
  // Open the file
  FileHandle := CreateFile(
    PChar(FileName),     // File name
    GENERIC_READ,        // Access (0, GENERIC_READ, GENERIC_WRITE)
    FILE_SHARE_READ,     // Sharing (0, FILE_SHARE_READ, FILE_SHARE_WRITE)
    Nil,                 // Security settings
    OPEN_EXISTING,       // How to create
    FILE_FLAG_RANDOM_ACCESS,  // Flags and attributes
    0);                  // handle of file with attributes to copy
  if FileHandle = INVALID_HANDLE_VALUE then Win32CheckKnown(GetLastError);
  try
    // Create the mapping
    MapHandle := CreateFileMapping(
      FileHandle,
      Nil,
      PAGE_READONLY,
      0, Cardinal(FSize),
      NIL);
    if MapHandle = 0 then Win32CheckKnown(GetLastError);
    try
      // Map it!
      FMemory := MapViewOfFile(  // Ex?
        MapHandle,
        FILE_MAP_READ,
        0, 0,
        Cardinal(FSize));
      if FMemory = Nil then Win32CheckKnown(GetLastError);
      //raise Exception.Create('Could not map a view of the file');
    except
      CloseHandle(MapHandle);
      MapHandle := 0;
      raise;
    end;
  except
    CloseHandle(FileHandle);
    FileHandle := INVALID_HANDLE_VALUE;
    raise;
  end;
  {$ELSEIF DEF POSIX}}
  // Open the file
  FileHandle := Fileopen(_FileName, fmOpenRead or fmShareDenyNone );

  if FileHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;

  // Map it!
  FMemory := mmap(nil,FSize,PROT_READ, MAP_SHARED,FileHandle,0);

  if FMemory = Nil then RaiseLastOSError;
  {$ELSE}
  ShowMessageMultiplatform('MMF not supported on your platform!');
  {$ENDIF}
end;

destructor TMMFStream.Destroy;
begin
  {$IFDEF MSWINDOWS}
  if FMemory <> Nil then
    UnmapViewOfFile(FMemory);
  if MapHandle <> 0 then CloseHandle(MapHandle);
  {$ELSEIF DEF POSIX}}
  if FMemory <> Nil then
    if munmap(FMemory, FSize) <> 0 then
      RaiseLastOSError;
  {$ENDIF}
  if FileHandle <> INVALID_HANDLE_VALUE then FileClose(FileHandle);
  inherited Destroy;
end;

function TMMFStream.Read(var Buffer; Count : Longint) : Longint;
begin
  if FOffset + Count > FSize then
    Count := FSize - FOffset;
  Move(PByte(FMemory)[FOffset], Buffer, Count);
  Inc(FOffset, Count);
  Result := Count;
end;

function TMMFStream.Write(const Buffer; Count : Longint) : Longint;
begin
  Result := 0;
  if FOffset + Count > FSize then
    Exit;
  Move(Buffer, PByte(FMemory)[FOffset], Count);
  Inc(FOffset, Count);
  Result := Count;
end;

function TMMFStream.Seek(Offset : Longint; Origin : Word) : Longint;
begin
  case Origin of
    soFromBeginning: FOffset := Offset;
    soFromCurrent: FOffset := FOffset + Offset;
    soFromEnd: FOffset := FSize - Offset;
  end;
  Result := FOffset;
end;


function TMMFStream.Offset(Offset : Integer) : Pointer;
begin
  if (Offset < 0) or (Offset >= FSize) then
    Result := nil
  else
    Result := @PByte(FMemory)[Offset];
end;

end.

...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593072
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отличный повод перейти с ini на json и просто загружать настройки в объект TMySettings одной строкой
YouTube Video
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593135
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rможет кому пригодится - исходник с MMF под Win и Android в одном флаконе.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
  FileHandle := CreateFile(
    PChar(FileName),     // File name
    GENERIC_READ,        // Access (0, GENERIC_READ, GENERIC_WRITE)
...
function TMMFStream.Write(const Buffer; Count : Longint) : Longint;
begin
  Result := 0;
  if FOffset + Count > FSize then
    Exit;
  Move(Buffer, PByte(FMemory)[FOffset], Count);
  Inc(FOffset, Count);
  Result := Count;
end;


Отличный код :) А что будет, если открыть файл размером больше 2Гб на Win32?..
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593153
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

"мультиплатформенность" - это все, кроме Win32. :)
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593164
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

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

.ini файлов по 2Гб на мультиплатформенных системах быть не может.

Исключительно на Win32. :)
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593174
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Ну MMF для ini-файлов использовать - это как-то жёстко :)
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593176
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Художник так видит.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593180
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
Код: pascal
1.
2.
3.
  {$ELSE}
  ShowMessageMultiplatform('MMF not supported on your platform!');
  {$ENDIF}

Вы компилируйте, а там как пойдет
Код: pascal
1.
2.
3.
  {$ELSE}
    {$MESSAGE Error 'MMF not supported on your platform!'};
  {$ENDIF}
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593182
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpОтличный код :) А что будет, если открыть файл размером больше 2Гб на Win32?..

стресс-тесты на многогиговых ini файлах не проводил, пока что максимум - 900 мб.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593191
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Vizit0r
Код: pascal
1.
2.
3.
  {$ELSE}
  ShowMessageMultiplatform('MMF not supported on your platform!');
  {$ENDIF}

Вы компилируйте, а там как пойдет
Код: pascal
1.
2.
3.
  {$ELSE}
    {$MESSAGE Error 'MMF not supported on your platform!'};
  {$ENDIF}



по текущей инфе от эмбы - POSIX это все кроме виндового dcc32\64. Так что получить ошибку будет непросто.

Реально же тестилось пока только на андроиде по банальнейшей причине - покупать себе яблокофон ради тестов я не собираюсь, а эмуляторы - как бы хлам. Возможно, как будет много ненужного времени - поставлю на виртуалку макось.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593245
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinотличный повод перейти с ini на json и просто загружать настройки в объект TMySettings одной строкой

читал я еще давно про это, сейчас освежил знания.

В целом удобно, но не в моем случае.

У меня нет одного супер-мега класса, в котором хранится ВСЁ.

Плюс к этому основной файл ini дополняется из нескольких источников (FormPosition, измененные настройки от SyntEdit, и еще по мелочам с других мест).


Переделывать это все ради...а ради чего собственно? Профита в конкретно этом проекте никакого.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593429
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравните это
Vizit0rполучить ошибку будет непросто.с этим
получить ошибку невозможно
и продолжайте разбрасывать грабли
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593693
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

та я исправил уже. И здесь, и еще в паре похожих мест.
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39593798
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0ralekcvpОтличный код :) А что будет, если открыть файл размером больше 2Гб на Win32?..

стресс-тесты на многогиговых ini файлах не проводил, пока что максимум - 900 мб.
Я ещё имел в виду, что ваш поток, при обращении к методу Write(), ничтоже сумняшеся попытается записать данные в файл, открытый как GENERIC_READ :)
...
Рейтинг: 0 / 0
Перевод приложения на мультиплатформенность.
    #39594111
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пропустил при выкладывании всюда.
Т.к. у меня MMF только для чтения, то я изменил соответственно. Я вообще везде явно позадавал права на только чтение, а там где нужна запись - проверяю наличие прав на запись перед тем как.
...
Рейтинг: 0 / 0
68 сообщений из 68, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перевод приложения на мультиплатформенность.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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