- PVSM.RU - https://www.pvsm.ru -
Поставили как-то передо мной задачу написать несколько юнитов на Delphi [1], обеспечивающих доступ к следующим возможностям Windows:
Использовать компоненты сторонних разработчиков было нельзя. Shared memory [2] предполагалось использовать для сортировки текстовых файлов больших размеров – несколько десятков или даже сотен мегабайт, на которых TStringList падал с EOutOfMemory. Pipes [3] – для передачи файлов от одного приложения другому.
Переписать код примеров из документации Microsoft с C на Delphi – это было даже не полдела, а процентов 10. Главное было связать это все вместе, дописать, где нужно, дополнительные функции и заставить всё это работать, а не просто существовать в виде исходного кода. В результате родился такой уродливый монстр, что его не то, что показывать кому-то, а просто смотреть на него было страшно. Однако, может, кто-то найдет в его недрах что-то для себя полезное (а вдруг?), поэтому я решил его здесь выложить. На всеобщее поругание. Полный исходный код этой abomination выложен на GitHub [1]. В тексте статьи будут даны названия файлов, где можно посмотреть тот или иной кусок реализации.
Первая задача – сортировка текстового файла – решалась так:
Сортировку заказчик обязательно хотел сделать многопоточной, поэтому в качестве алгоритма сортировки была взята Merge Sort [8]. (Спасибо тому гуру, который создал рабочую реализацию и выложил ее на Stackoverflow.)
Вторая задача – передача файла от одного приложения к другому – оказалась куда сложнее. Получить реализацию pipes на Delphi на основе примеров Microsoft – это одно, но сделать из нее рабочую передавалку файлов – совсем другое. В качестве программы-сервера Microsoft предлагает несколько вариантов:
Как выяснилось в результате двухнедельных мучений, реализация механизма передачи файла на основе первого варианта сервера (Multithreaded Pipe Server [9]) оказывается слишком сложной. Разумнее использовать второй вариант (Named Pipe Server Using Overlapped I/O [10]), с ним реализация получается куда проще (правда, заказчик по каким-то своим причинам очень хотел именно первый вариант сервера [9]). Но всё равно пришлось помучиться, чтобы довести всё это дело до ума. В результате родился передатчик файлов на основе pipes: TCommunicationEndpointBase (CommunicationTestSimpleCommunicationUnit.pas).
Вкратце, передача файлов работает так:
Все нюансы реализации можно посмотреть на GitHub [1], где выложен полный код всего вышеперечисленного. Всё оформлено в виде одного приложения (BlitzTestBlitzTest.dproj), достаточно его скачать, собрать и запустить.
Да, еще там до кучи лежит оптимизированная реализация функции StringReplace [12] (BlitzTestStringReplaceCustomUnit.pas). Может, кому пригодится.
Любые комментарии (в том числе и откровенная ругань) приветствуются.
Если вдруг (ну, а вдруг?) кого-то заинтересуют другие мои репозитории, то могу и о них пару слов написать. Если, конечно, этот текст вообще опубликуют.
Автор: ShaltaiBoltai
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/delphi/353739
Ссылки в тексте:
[1] несколько юнитов на Delphi: https://github.com/L00pZBreak3r/BlitzTest
[2] Shared memory: https://docs.microsoft.com/ru-ru/windows/win32/memory/sharing-files-and-memory
[3] Pipes: https://docs.microsoft.com/ru-ru/windows/win32/ipc/using-pipes
[4] CreateFile: https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew
[5] CreateFileMapping: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createfilemappinga
[6] MapViewOfFile: https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffile
[7] ACP: https://docs.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-getacp
[8] Merge Sort: https://stackoverflow.com/questions/23531625/multithreaded-sorting-application/23532317
[9] Multithreaded Pipe Server: https://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-server
[10] Named Pipe Server Using Overlapped I/O: https://docs.microsoft.com/en-us/windows/win32/ipc/named-pipe-server-using-overlapped-i-o
[11] Named Pipe Server Using Completion Routines: https://docs.microsoft.com/en-us/windows/win32/ipc/named-pipe-server-using-completion-routines
[12] StringReplace: http://docwiki.embarcadero.com/Libraries/Rio/en/System.SysUtils.StringReplace
[13] Источник: https://habr.com/ru/post/505568/?utm_source=habrahabr&utm_medium=rss&utm_campaign=505568
Нажмите здесь для печати.