Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: xobotik Россия  
Дата: 15.07.14 13:19
Оценка:
Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий. (Linux, Windows)

P.S. Возможно это как-то проще называется, но не знаю как. Первый раз задачу поставили.
Из одного приложения (не зависит от Qt) передать изображения в другое приложение (которое зависит от Qt).
Задача просто идиотская, ну просто так поставили задачу ((

Заранее спасибо!
С уважением!
Re: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: Evgeny.Panasyuk Россия  
Дата: 15.07.14 13:23
Оценка: 15 (1)
Boost.Interprocess
Re[2]: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: xobotik Россия  
Дата: 15.07.14 13:31
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Boost.Interprocess


А если приложение на продажу?
С уважением!
Re[3]: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: Evgeny.Panasyuk Россия  
Дата: 15.07.14 13:41
Оценка: 15 (1)
Здравствуйте, xobotik, Вы писали:

EP>>Boost.Interprocess

X>А если приложение на продажу?

В чём вопрос-то? С лицензией проблем нет:

http://www.boost.org/LICENSE_1_0.txt
Boost Software License — Version 1.0 — August 17th, 2003

Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:

The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

Re[4]: Посоветуйте кроссплатформеную библиотеку межпроцессны
От: xobotik Россия  
Дата: 15.07.14 13:44
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

Спасибо!
С уважением!
Re[2]: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 15.07.14 14:33
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Boost.Interprocess


Слушай, а оно юзабельное? Ну, есть практика использования в продакшн коде? Я как-то наткнулся на то, что на *NIX-ах все очень хорошо, но при работе на Windows, зачастую, вылезают крайне трудно уловимые глюки связанные с открываемыми Interprocess файлами для синхронизации. Лекарства мы тогда не нашли и решили за пределами *NIX ее не использовать.
Re[3]: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: Evgeny.Panasyuk Россия  
Дата: 15.07.14 14:44
Оценка: 1 (1)
Здравствуйте, kaa.python, Вы писали:

EP>>Boost.Interprocess

KP>Слушай, а оно юзабельное? Ну, есть практика использования в продакшн коде? Я как-то наткнулся на то, что на *NIX-ах все очень хорошо, но при работе на Windows, зачастую, вылезают крайне трудно уловимые глюки связанные с открываемыми Interprocess файлами для синхронизации. Лекарства мы тогда не нашли и решили за пределами *NIX ее не использовать.

Используется в одном из проектов на {Windows, Linux, OS X}x{x32, x64} — каких-то проблем с этой библиотекой не замечено, но там и взаимодействие достаточно простое (на основе message_queue).
Если остался локализованный test case — то можно отправить bug report.
Re[4]: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: SleepyDrago Украина  
Дата: 15.07.14 16:48
Оценка: 10 (2)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Используется в одном из проектов на {Windows, Linux, OS X}x{x32, x64} — каких-то проблем с этой библиотекой не замечено, но там и взаимодействие достаточно простое (на основе message_queue).

EP>Если остался локализованный test case — то можно отправить bug report.

не знаю как тау у kaa.python но в багобазе их и так навалом. Все изза того что они на каждый именованный объект создают файлы в странных папочках. Так что я себе в свое время сказал ни-ни, так как подход очевидно ущербен и переделан без выкидывания с водой ребенка быть не может.
Re: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 15.07.14 17:11
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий. (Linux, Windows)


Кстати, а ты не хочешь посмотреть на классику, т.е. CORBA? Как ни крути, до сих пор очень удачное решение позволяющее избегать проблем с взаимодействием между платформами.
Re: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: LuciferSaratov Россия  
Дата: 15.07.14 17:50
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Заранее спасибо!


я про ZeroMQ слышал много хорошего.
Re: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: c-smile Канада http://terrainformatica.com
Дата: 16.07.14 04:55
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Заранее спасибо!


Для bitmaps? Только shared memory на основе mmap
Re: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: Sashaka Россия  
Дата: 16.07.14 06:58
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий. (Linux, Windows)


X>P.S. Возможно это как-то проще называется, но не знаю как. Первый раз задачу поставили.

X>Из одного приложения (не зависит от Qt) передать изображения в другое приложение (которое зависит от Qt).
X>Задача просто идиотская, ну просто так поставили задачу ((

X>Заранее спасибо!


Делал такое, вот тестовый код (в итоге reader — одно приложение, writer — другое):
    namespace bip = boost::interprocess;
    using namespace boost::gil;
    
    typedef bip::managed_windows_shared_memory managed_shared_memory_t;
    typedef bip::allocator<DkTools::byte, managed_shared_memory_t::segment_manager> bytes_allocator_t;
    typedef bip::vector<DkTools::byte, bytes_allocator_t> bytes_vector_t;
    typedef bip::deque<DkTools::byte, bytes_allocator_t> bytes_deque_t;
    
    typedef bip::interprocess_mutex mutex_t;
    
    tcout << ( reader ? _T("Reader") : _T("Writer") ) << std::endl;
    tcout << _T("Press any key to exit...") << std::endl;
    if ( reader )
    {
        try
        {
            while ( !_kbhit() )
            {
                managed_shared_memory_t obj(bip::open_only, object_name.c_str()); 
                mutex_t* mutex = obj.find<mutex_t>(mutex_name.c_str()).first;
                if ( !mutex )
                {
                    tcout << _T("Sync objects not found!") << std::endl;
                    continue;
                }

                bip::scoped_lock<mutex_t> lock(*mutex);
                
                minitools::perf_counter counter(true);

                const int* width = obj.find<int>(width_name.c_str()).first;
                const int* height = obj.find<int>(height_name.c_str()).first;
                const int* channels = obj.find<int>(channels_name.c_str()).first;
                const int* pitch = obj.find<int>(pitch_name.c_str()).first;
                const bytes_vector_t* frame = obj.find<bytes_vector_t>(frame_name.c_str()).first;
                bool* frame_ready = obj.find<bool>(frame_ready_name.c_str()).first;
                bytes_deque_t* commands = obj.find<bytes_deque_t>(commands_name.c_str()).first;
                
                if ( !width || !height || !channels || !pitch || !frame || !frame_ready || !commands )
                {
                    tcout << _T("Frame data not found!") << std::endl;
                    continue;
                }

                if ( *frame_ready )
                {
                    assert(*channels == 3);

                    image_t img;
                    img.recreate(*width, *height);
                    image_t::const_view_t srcview = 
                        interleaved_view( *width, *height, reinterpret_cast< const image_t::view_t::value_type* >( &*frame->cbegin() ), *pitch );
                    copy_pixels( srcview, view( img ) );

                    *frame_ready = false;

                    try
                    {
                        jpeg_write_view( out_name, const_view( img ) );  
                    }
                    catch ( std::exception& e )
                    {
                        tcout << _T("Write error : ") << e.what() << std::endl;
                    }
                }
                
                commands->push_back( ( minitools::random() % 2 == 0 ) ? 0x00 : 0x01 );

                const double read_time = counter.stop();

                tcout << _T("Read done : ") << read_time << _T(" msec") << std::endl;

                lock.unlock();
                Sleep(500);
            }
        }
        catch (std::exception& e)
        {
            tcout << _T("Exception : ") << e.what() << std::endl;
        }
    }
    else //writer
    {
        try
        {
            image_t img_gray, img_rgb;                
            jpeg_read_image(rgb_name, img_rgb);
            jpeg_read_image(gray_name, img_gray);

            managed_shared_memory_t obj(bip::open_or_create, object_name.c_str(), object_size); 
            int* width = obj.construct<int>(width_name.c_str())();
            int* height = obj.construct<int>(height_name.c_str())();
            int* channels = obj.construct<int>(channels_name.c_str())(num_channels<image_t>::value);
            int* pitch = obj.construct<int>(pitch_name.c_str())();
            bytes_vector_t* frame = obj.construct<bytes_vector_t>(frame_name.c_str())(obj.get_segment_manager());
            bool* frame_ready = obj.construct<bool>(frame_ready_name.c_str())(false);
            bytes_deque_t* commands = obj.construct<bytes_deque_t>(commands_name.c_str())(obj.get_segment_manager());
            mutex_t* mutex = obj.construct<mutex_t>(mutex_name.c_str())();
            while ( !_kbhit() ) 
            {
                static bool flag = true;
                const image_t& img = flag ? img_rgb : img_gray;
                flag = !flag;

                bip::scoped_lock<mutex_t> lock( *mutex );

                minitools::perf_counter counter(true);
           
                *width = img.width();
                *height = img.height();
                *pitch = const_view(img).pixels().row_size();
                
                const size_t frame_size = (*height) * (*pitch);
                const DkTools::byte* frame_data = 
                    static_cast<const DkTools::byte*>( interleaved_view_get_raw_data( const_view( img ) ) );

                if ( frame->size() < frame_size )
                    frame->resize(frame_size);
                frame->assign(frame_data, frame_data + frame_size);
                *frame_ready = true;

                while ( !commands->empty() )
                {
                    const DkTools::byte command = commands->front();
                    commands->pop_front();
                    tcout << _T("Got command : ") << command << std::endl;
                }
                const double write_time = counter.stop();
                tcout << _T("Write done : ") << write_time << _T(" msec") << std::endl;
            }
            obj.destroy<mutex_t>(mutex_name.c_str());
        }
        catch (std::exception& e)
        {
            tcout << _T("Exception : ") << e.what() << std::endl;
        }
    }
Re[2]: Посоветуйте кроссплатформеную библиотеку межпроцессных взаимодействий
От: Mr.Delphist  
Дата: 16.07.14 11:10
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, xobotik, Вы писали:


X>>Заранее спасибо!


CS>Для bitmaps? Только shared memory на основе mmap


Если у товарища уже есть boost в проекте, то там тоже есть memory-mapped files
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.