Обмен данными между процессами

Тема в разделе "WASM.WIN32", создана пользователем spa, 19 июл 2008.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Есть exe, он при старте стартует другой ехе и подгружает ему длл, слбсно как наиболее оптимально организовать обмен данными причем более мение синхронный т.е. длл говорит ехе когда что делать пока мысля с помощью оконных сообщений, но возникает сложность с обменом кусков памяти например строк. Была мысля отпровлять сначало строку а потом сообщение что с ней делать, но как то это слишком надуманн. Жду ваших предложений.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    извините за ошибки, я забыл что незя редактировать )
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    мейлслот для обмена именами пайпов
    двунаправленный пайп для обмена непосредственно информацией (по типу сокетов)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    MSoft
    Медленно это.
    LPC быстрее в разы. А лучше выполнять обмен через разделяемую память с синхронизацией по эвентам.
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    MSoft
    Clerk
    Поподробней если не сложно +/- что выбрать то )
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Создаешь 1 мейлслот и через него обмениваешься именами пайпов. Потом на одном конце создаешь такой пайп, а на другом - коннектишься к нему. И дальше просто отправлешь в него инфу.

    "+" этого метода - интерфейс как у привычных блокирующихся сокетов. Про метод Clerk ничего сказать не могу, т.к. не понял, о чем он :)
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    LPC просто, если слишком высокая скорость не нужна используй этот механизм, он используется при любых действиях с консолями к примеру.
    Если нужно бысро очень, тогда создай именованную секцию(обьект секция, именованная или нет зависит от тебя), спроецируй в оба процесса это и будет канал через который будут передаваться данные. Для синхронизации - один либо два эвента, именованные или нет также зависит от тебя.
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Clerk
    твой метод, я так полагаю, подходит только для 2-х процессов, так? моим может пользоваться неограниченное* количество клиентов и 1 сервер
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    MSoft
    Ему не нужен универсальный способ, тогда точно LPC.
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Вы еще подеритес ьгорячии финские парни )
    Clerk
    Да мысля обмениваться через общию секцию данных сейчас расматриваеться, просто понимаете у меня в основном короткие строки, не будет ли это из пушки по воробьям. Кстате я не понял как вы предлагаетесообщать программа когда пора обрабатывать данные?
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SPA
    Поток принимающий данные ждёт на евенте(с автосбросом) в NtWaitForSingleObject. Поток передающий данные записывает их в секцию, сигнализирует евент и ждёт его. Поток принимающий данные выйдет из состояния ожидания и считает данные из секции, обработает их и запишет результат в секцию, затем сигнализирует евент и снова его ждёт. Поток передающий данные выйдет из состояния ожидания и считает ответ.
     
  12. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Clerk
    А спасибо понял... благодарю за помощь, думаю хороший вариант, лучше оконных сообщений )

    Ща пощу доку про именнованые секции, я с ними не работал еще.


    MSoft
    тоже спасибо, но в моем случае правда надотолько для 2х поцессов
     
  13. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    SPA
    NativeApi.pdf, классный ман тут про все есть и про LPC тоже.
     
  14. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    all
    Вот какой у меня вопросик то остался, мне самомму в потоках которые ждут придеться смотреть для меня он или нет, так. Просто при SetEvent не извесно какому потоку передасться инфа, поэтому надо смотреть мне это или не мне. Так? я думаю просто байтик в начале памяти и усе.
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    а и еще я говорю про метод с секциями и обьектами, а что такое LPC, но это не важно мне понравился метод с памятью/обьектами
     
  16. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    LPC - Local Procedure Call.
    Сервер создает порт (ZwCreatePort), начинает слушать порт (ZwReplyWaitReceivePort,..) затем клиент может приконектится к порту (ZwConnectPort,..) используя его идентификатор,
    сервер и клиент могут начать обмен сообщениями (ZwRequestWaitReplyPort,..) в которых помимо заголовка, можно передавать данные небольшого размера для передачи данных большого размера, предусмотрен механизм с разделяемой секцией.
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну не обязательно так, можно просто создать безымянный порт, сделать дубликат хендла порта и передать его другому процессу. тогда не потребуется коннект или акцепт.
     
  18. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Только для передачи больших объемов данных придется секцию проецировать в оба процесса самому, а так ядро все за нас сделает ;)
     
  19. CodeGrinder

    CodeGrinder New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    56
    А можно как-то по-проще организовать обмен между двумя процессами? Реально нужно передать одно значение!)
     
  20. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    CodeGrinder

    Кстати, да, и почему никто не вспомнил про file maps