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


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