2010-01-12 3 views
5

Привет, переполнение стека: Иногда читатель, первый раз плакат.IPC между приложением python и инъецированной DLL

фона:

окно Windows, работает XP SP3, скоро будет повышен до Windows Seven (MSDNAA < 3)

У меня есть впрыскивается DLL, которая получает циклы зацепив функцию, которая называется тысячи раз в секунду.

Я хотел бы сообщить/управлять этой DLL через приложение python. В основном, DLL выполняет эту работу, приложение python поставляет мозги/принятие решений.

Мой план игры для этого, есть ли у меня счетчик и инструкция if в DLL. Каждый раз, когда вызываемая функция вызывается, counter ++, а затем возвращается к исходной функции до тех пор, пока что-то вроде if (counter == 250) {// dostuff(); }. Мой, хотя позади этого, позволит целевому приложению работать в основном беспрепятственно, но все равно позволит мне делать интересные вещи.

Проблема:

Я на полной потери, какой метод IPC я должен использовать, чтобы сделать связь. У нас есть сокеты, общая память, каналы, сопоставление файлов (?), RPC и другие (казалось бы) эзотерические вещи, такие как запись в буфер обмена.

Я НИКОГДА не выполнял никаких IPC за пределами примеров игрушек.

Я довольно уверен, что нужно что-то, что:

  • Может обрабатывать говорить взад и вперед между питон и DLL
  • Не блокировать/ждать
  • Можно проверить для ожидания данных, и продолжить работу, если нет каких-либо
  • Если замки участвуют, могут продолжать вместо ожидания
  • не стоит много времени, чтобы читать/писать слишком

Помощь? Спасибо за ваше время, я надеюсь, что предоставил достаточную общую информацию и не нарушил никаких принятых конвенций.

Я хотел бы добавить, что связанная с этим тема коробка очень крутая, и я просматривал ее перед публикацией.

ответ

2

Попробуйте розетки. Ваши требования по существу являются требованием асинхронной работы; Python имеет модуль asyncore для асинхронных IO на сокетах. В то же время, это не похоже, что stdlib Python может асинхронно обрабатывать другие вещи IPC, поэтому я бы не рекомендовал их использовать.

1

Если вам не все равно в реальном времени, вы можете использовать файловую систему для связи: файл журнала для вывода DLL и файл конфигурации, который читается время от времени, чтобы изменить поведение DLL.

+1

Использование файла журнала - это * не * IPC вообще. – ulidtko

+0

@ulidtko Файловая система является самой старой и надежной формой синхронизации IPC. Вот почему стандарт POSIX имеет тот же API для всех форм IPC. Поскольку ОС ** должна ** управлять согласованностью и синхронизацией в операциях файловой системы (или не называться ОС), файловая система - это самая простая реализация IPC для использования в программах, отличных от ОС. Попробуйте 'ls/var/run/*.pid' в следующий раз, когда у вас будет доступ к системе * nix. – Apalala

+1

Печать еще более старая и надежная форма ... хранения информации на бумаге. OS ** должна ** управлять согласованностью того, что будет напечатано, и любой человек может управлять всей необходимой синхронизацией. Почему бы вам не попробовать распечатать «Привет, мир!». на бумаге, а затем сканирование и распознавание его для управления вашей программой? Извините, но ваш комментарий не просто аргумент. Принтеры должны печатать документы, файловые системы должны хранить файлы, shmem-pipe-сокеты должны обеспечивать способы выполнения IPC. – ulidtko

Смежные вопросы