0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
|
|
1 | |
Передача информации между процессами через MappingFile29.10.2017, 20:03. Показов 4486. Ответов 15
Метки нет Все метки)
(
Задача такая, реализовать программу копирующую файл, где в одном процессе происходит чтение, а во втором запись, для передачи данных между процессами решил использовать MappingFile, но не могу понять как записать в него в одном процессе, а потом прочитать в другом? Или может есть лучшее идеи передачи информации между процессами?
0
|
29.10.2017, 20:03 | |
Ответы с готовыми решениями:
15
MappingFile передача информацию между процессами Передача строки символов между процессами с использованием именованных каналов Передача классов между процессами через WCF
|
4026 / 2572 / 430
Регистрация: 09.09.2017
Сообщений: 11,490
|
|
29.10.2017, 21:45 | 2 |
Отображение файла на память это не лучший способ обмена данными между процессами. Лучше использовать каналы (pipes) - они позволяют обмениваться в том числе по сети, хотя и ограниченно. Другая проблема с каналами, что мне так и не удалось сделать их неблокирующими (чтобы читающая программа не зависала если канал пуст). Может, вам повезет больше.
Еще один способ - разделяемая память, но с этим я дела не имел. Другое дело что если нужен результат а не процесс, есть стандартные способы, не обязательно изобретать велосипед.
0
|
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
|
||||||
29.10.2017, 23:09 | 3 | |||||
Не пробывал в отдельном потоке пускать чтения, а затем уведомлять основной?
Если вообще влоб, то копируем файл в виртуальную память первого процесса. Кликните здесь для просмотра всего текста
Магическим образом передаем адрес памяти и размер, который необходимо прочитать, другому процессу и читаем его ( если винда, то OpenProccess->ReadProcessMemory). А вообще хотелось бы увидеть нормальную реализацию MappingFile (без буста).
0
|
4026 / 2572 / 430
Регистрация: 09.09.2017
Сообщений: 11,490
|
|
30.10.2017, 00:50 | 4 |
Так обмен и должен был быть между отдельными потоками. Чтобы передавать данные потоком, а не мьютексами. Да и потом, неужели нет нормального способа?
А хватит памяти? Мы же не знаем размер файла. Могу выложить свою реализацию. Надо?
0
|
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
|
|
30.10.2017, 02:01 | 5 |
Размер файла мы знаем. Да и не думаю, что планируется кидаться файлами больше гигабайта.
Я б для себя посмотрел бы. Добавлено через 59 секунд Чет мне кажется, что пайпы не про это)
0
|
4026 / 2572 / 430
Регистрация: 09.09.2017
Сообщений: 11,490
|
||||||
30.10.2017, 09:14 | 6 | |||||
Откуда нам знать? Если есть возможность делать универсально, лучше так и сделать. Если решать именно ту задачу, которую описал ТС (один процесс читает файл, передает данные второму, тот пишет), можно использовать каналы, разделяемую память с семафорами, может даже сеть. При чем на счет каналов можно сделать даже на стандартных программах:
cat file | tee file_cp (не знаю как именно это в DOS делается).А для чего тогда? https://github.com/COKPOWEHEU/memfile/tree/master
0
|
Maniac
![]() |
|
30.10.2017, 14:08 | 7 |
0
|
4026 / 2572 / 430
Регистрация: 09.09.2017
Сообщений: 11,490
|
|
30.10.2017, 14:24 | 8 |
Это-то еще в первом ответе было предложено. Но мы не знаем задачу ТСа. Вдруг ему надо именно через отображение файла на память.
0
|
Maniac
![]() |
|||||||||||
30.10.2017, 14:40 | 9 | ||||||||||
Чем это плохо, если решает задачу?
Грубо говоря со стороны клиента
0
|
4026 / 2572 / 430
Регистрация: 09.09.2017
Сообщений: 11,490
|
|
30.10.2017, 15:50 | 10 |
Это приводит к лишним дисковым операциям (мы же записываем в отмапленный файл не результат, а передаваемые куски). То есть потеря производительности. Плюс надо каким-то образом регулировать обмен чтобы не было одновременной записи и чтения одной и той же области.
Я не говорю, что отображение памяти на файл нельзя использовать для обмена, но это неэффективный и сложный способ. А можно полный код? Использование простых WriteFile / ReadFile без callback'ов и событий нужного эффекта вообще не давало. К тому же у вас канал создается не байтовый и с флагом PIPE_WAIT. Пока что я не представляю как дополнить этот код до рабочего состояния.
1
|
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 23
|
|
30.10.2017, 18:33 [ТС] | 11 |
Был бы очень благодарен
Добавлено через 36 минут COKPOWEHEU, если не затруднит, не могли бы выложить реализацию, где в одном процессе создаём mapping и записываем в него к примеру массив, а в другом процессе открываем mapping и читаем из него массив
0
|
![]() 12569 / 8750 / 1311
Регистрация: 21.01.2016
Сообщений: 32,817
|
|
30.10.2017, 18:54 | 12 |
Серьёзно чтоли?
![]()
0
|
4026 / 2572 / 430
Регистрация: 09.09.2017
Сообщений: 11,490
|
||||||
30.10.2017, 19:33 | 13 | |||||
Отображение файла на память это именно отображение файла (области жесткого диска) на ОЗУ. То есть работа с ОЗУ одновременно перезаписывает файл. Насколько мне известно, этот способ обычно применяется для быстрого чтения / записи файла на диск, для быстрого произвольного доступа, но не для совместной работы. Более того, один и тот же файл может отображаться на несколько непересекающихся областей ОЗУ одновременно. Собственно, я не уверен что все системы правильно понимают одновременную работу разных программ с одним и тем же файлом.
Разные программы писать было лень, вместо этого макросами выделил линуксовую версию для создания файла и записи в него, а виндовую - для чтения. Проверка (виндовая версия - в wine) показала работоспособность. Разумеется, там могут найтись баги - буду благодарен если найдете и поможете исправить.
0
|
![]() 12569 / 8750 / 1311
Регистрация: 21.01.2016
Сообщений: 32,817
|
|
30.10.2017, 20:03 | 14 |
COKPOWEHEU, посмотрите ссылку в посте №7. Там идёт речь о mapped file без создания самого файла. Так называемая Shared Memory. Т.е. одно дело отображение в память реального файла и другое дело - IPC посредствам того же механизма, но без физического файла.
0
|
4026 / 2572 / 430
Регистрация: 09.09.2017
Сообщений: 11,490
|
|
30.10.2017, 23:00 | 15 |
Usaga, не путайте эти два механизма. Отображение файла на память нужно в первую очередь для работы с файлами. А разделяемая память или каналы, хоть и могут выглядеть как файлы, не служат для постоянного хранения информации.
0
|
03.11.2017, 20:19 | 16 |
Старaясь попасть в тему, не открывая новую тему, спрошу на смежную тему…
А можно ли вообще, находясь под чужой прикладной средой и имея в распоряжении указатель, переоформить его в FileMapping? Поясню: Написал под VirtualDub свой фильтр, который организует задержку захватываемого потока видео ровно на 1 кадр. При загрузке плагина с моим фильтром он открывает на диске bmp-файл общего доступа со всеми заголовками. Когда с веб-камеры приходит очередной кадр, мой код пиксел за пикселом читает тот bmp-файл и отправляет всё на выход (экран/DivX-компрессор), а пиксели нового кадра помещает в bmp-файл. Т.е. bmp-файл является промежуточным звеном между источником (веб-камеры) и приёмником (записываемый avi-файл). И другая программа, специально написанная под эту цель, успевает в bmp-файл вставить свои трюки (тайм-код, OpenGL-анимацию и логотипы). Всё работает, но жрёт ресурсы - от 5% до 25% процессора… Могу ли я не создавать промежуточный bmp-файл, а получив указатели входного кадра и кадра для моего результата оформить как два отдельных файла, чтобы избежать промежуточное копирование и сторонней своей программой напрямую работать с буферами как файлами? Пытался я подставлять указатели в CreateFileMapping/CreateDIBSection и т.д. Возвращают они ошибку доступа. Можно ли подставить готовый указатель памяти под проекцию файла? Спасибо!
0
|
03.11.2017, 20:19 | |
03.11.2017, 20:19 | |
Помогаю со студенческими работами здесь
16
Передача handle между процессами Передача данных между процессами (pipe) Передача сообщений между процессами и потоками Передача данных между потоками/процессами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
|||||
В чем отличие между INNER JOIN и OUTER JOIN
bytestream 22.01.2025
В современных базах данных информация часто распределена между множеством взаимосвязанных таблиц, что делает операции объединения JOIN неотъемлемой частью работы с SQL. Эти операции позволяют. . .
|
Как сделать первую букву заглавной в JavaScript
bytestream 22.01.2025
JavaScript предоставляет разработчикам множество инструментов для эффективной работы с текстовыми данными. Одной из часто встречающихся задач при обработке строк является преобразование первой буквы. . .
|
Что такое Big O нотация и алгоритмическая сложность
bytestream 22.01.2025
Введение в алгоритмическую сложность
В мире разработки программного обеспечения эффективность алгоритмов играет crucial роль в создании качественных приложений. Алгоритмическая сложность. . .
|
Как решать конфликты слияния (merge) в Git
bytestream 22.01.2025
Конфликты слияния в системе контроля версий Git возникают в ситуациях, когда две или более ветки разработки содержат несовместимые изменения в одних и тех же участках кода. Эти конфликты представляют. . .
|
Как использовать регулярные выражения
bytestream 22.01.2025
Регулярные выражения представляют собой мощный инструмент для работы с текстовыми данными, который позволяет осуществлять поиск, проверку и манипуляцию строками на основе определенных шаблонов. Этот. . .
|
Как выйти из Vim
bytestream 22.01.2025
Vim (Vi IMproved) представляет собой один из самых влиятельных текстовых редакторов в истории компьютерной индустрии, эволюционировавший из своего предшественника Vi, созданного Биллом Джоем в 1976. . .
|
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
|
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. )
Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
|
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
|
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
|
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
|
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
|