Приложение C # для C ++ dll обратно в приложение C # через обратные вызовы - PullRequest
2 голосов
/ 11 июня 2009

Я пишу приложение на C #, которое вызывает C ++ dll. Эта DLL является драйвером устройства для системы обработки изображений; при получении изображения предварительный просмотр изображения доступен из библиотеки построчно. DLL C ++ принимает обратный вызов, чтобы заполнить предварительный просмотр, и этот обратный вызов состоит в основном из размера конечного изображения, отсканированной в данный момент строки и самой строки данных.

Проблема в том, что время остановки сканирования и обратного вызова C # перестает получать информацию. Ход программы идет примерно так:

  1. Назначение обратного вызова для C ++ dll из C #
  2. Пользователь начинает получать данные
  3. Устройство запускается
  4. DLL начинает вызывать обратный вызов через несколько секунд (в норме)
  5. Устройство завершает формирование изображения
  6. DLL все еще вызывает обратный вызов для удвоения времени формирования изображения.

Эта же DLL прекрасно работала с приложением C ++; похоже, что задержка последнего шага отсутствует. Однако в C #, если мне нужно немедленно вернуться, обратная связь все еще существует; независимо от того, что я делаю внутри обратного вызова, он есть.

Является ли эта задержка внутренним ограничением вызова управляемого кода из неуправляемого кода, или есть что-то, что любая из сторон могла бы сделать, чтобы это ускорилось? Я нахожусь в контакте с разработчиком библиотеки C ++, поэтому можно реализовать исправление со стороны C ++.

Редактировать: Может ли сделать что-то простое, как работа с именованным каналом? Может ли приложение читать из своего канала?

Ответы [ 3 ]

0 голосов
/ 15 июня 2009

Делаете ли вы какие-нибудь фанки сортировки данных на уровне взаимодействия? Если это так, то у вас может быть огромная задержка, в то время как в основном все данные вашего изображения собираются путем преобразования. Вы можете легко проверить это как большие данные изображения, тем дольше это займет

На ум приходят несколько возможных альтернатив:
1.Используйте файл отображения памяти, хотя вам нужно будет внедрить простой семафор или систему сигнализации, чтобы сказать «у меня есть данные готовы» и «я использовал данные
» 2. Скомпилируйте dll C ++ в смешанном режиме (любой код C ++ можно скомпилировать в .NET с флагом / clr), затем используйте C # / CLI
3. Используйте Remoting и каналы IPC - возможно, это немного излишне, но стоит посмотреть

Надеюсь, что поможет

0 голосов
/ 23 сентября 2009

Оказывается, задержка на стороне C ++, разработчиком, который поклялся, что это не так.

0 голосов
/ 11 июня 2009

Возможно, виновником является управляемый помощник по отладке, который проверяет собственные обратные вызовы для целей сбора мусора (находится ли он в режиме отладки в отладчике?)

См. PSA: Pinvokes может быть в 100 раз медленнее при записи в блоге отладчика Майка Сталла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...