процесса вызываю еще одну программу. И мне необходимо передать в дочерний процесс cv::Mat. Каким образом это возможно реализовать? Я думал, что возможно передать указатель на начало нужного куска памяти, его ширина-высота и собрать в дочернем процессе новый объект с этими вводными.
для общения между процессами сериализация потребуется почти без вариантов. потоками никак не разрулить?
Уточните еще вашу ОС
К сожалению, нет.
ubuntu
shared memory тебе в помощь
В разделяемых процессах лучше использовать не общую виртуальную память, а сокеты. На loopback интерфейс все будет достаточно быстро приходить/уходить
Если только fork, тогда можно передать указатель, примерно так, как вы написали. Если fork + exec, то shared memory, как подсказали выше
Не совсем понял, но насколько я понял, тебе надо передать из одной программы объект в другую программу. А другая эта программа сама не сумеет построить требуемый объект? Тебе нужно по сути ведь той другой программе передать не сам конкретный объект, а объект, наполненный какими то данными, так ведь. Значит тебе надо той программе просто передать информацию, какими данными наполнить объект. То есть та программа сама создаст объект, тебе нужно ей только передать информацию как этот объект наполнить. В идеале, если сам объект умеет сам себя строить, допустим он имеет какой то конструктор, при вызове которого, объект создается с требуемым наполнением. Тогда той программе ты просто не передаешь готовый объект, а всего лишь передаешь информацию какой конструктор вызвать, она тогда сама сможет создать объект, а конструктор наполнит данными.
я использую библиотеку, которая требуется для обработки изображений. Я из нескольких изображений собираю одно большое, нарезаю по кусочками и хочу обрабатывать несколько штук парралельно, но библиотека позволяет создавать только один объект обработки в процессе, независимо от того, сколько потоков существует, и буду ли я создавать объект обработки в каждом потоке отдельно - об этом пишут сами авторы либы. Я решил обойти это ограничение путем создания дочерних процессов и в каждый дочерний отправлять тот кусочек, который нужно обработать. Но как ненакладно по ресурсам отправить? - вопрос еще открытый
процесс синтеза этой информации в виде, пригодном для передачи по каналу, называется сериализацией, обратный - десериализацией :) это уже обсудили
а в документации к cv не указаны технические причины, по которым так сделано?
с этим не спорю, осталось устранить последнее препятсвие - собственные пробелы в знаниях
как они говорят, сделали её потокобезопасной, чтобы объектом обработки мог пользоваться только один поток
потому что.
а что такое "объект обработки"? может вам их просто несколько нужно? (очень мало работал с CV, простите)
Ну создай по обработчику в каждом потоке и каждому отдай свой кусок матрицы. Насколько память мне позволяет в opencv это возможно, главное матрицу не изменяй в этих потоках.
cv тут по сути нужно как обертка для работы с изображениями. Я получаю видеопоток из нескольких источников покадрово, после чего из них делаю общее полотно (несколько камер стоят рядом друг с другом) и согласно ТЗ отрезаю от него по нужным координатам кусочки и отправляю на обработку в zxing. А в одном процессе zxing можно обрабатывать только одно изображение
Мы с Вами такой вариант обсуждали и пробовали - он не работает
Ну тогда только через процессы и разделяемую память. Если входной объект корежить не будешь, то с разделяемой памятью всё просто. Если будешь, то ...
нет, входной объект не буду корежить. Как раз ищу информацию по использованию с fork-exec
аргумент🤔
А где там в коде такое ограничение на одно изображение?
У него там юзаемые сторонние либы с глобальным локом на горы глобальных внутренних переменных и могут только в один поток в одном процессе.
Так я уже эту стороннюю либу нашёл и смотрю её код, поэтому и спрашиваю
А я ему поверил. При запуске в некольких потоках, вызовы выстраюваются в цепочку линейную.
Обсуждают сегодня