2011-01-26 2 views
6

Первое, что я сделал (минимум образец будет обеспечен, если это не только я делаю что-то глупо):Совместное повышение :: ASIO :: объект io_service между динамически загружаемых библиотек

У меня есть приложение с графическим интерфейсом, который должен поддерживать несколько сетевых интерфейсов для изменения содержимого, отображаемого в графическом интерфейсе. Сетевые интерфейсы реализуются как плагины, которые динамически загружаются при запуске GUI. Приложение GUI предоставляет объект boost :: asio :: io_service, который передается через ссылку на интерфейсы, поэтому они могут использовать его для построения асинхронного ввода-вывода. В потоке GUI этот объект io_service опрошен, чтобы синхронизировать доступ сетевых интерфейсов к контенту.

Проблема в том, что обработчики не вызываются объектом io_service при его опросе. Чтобы сузить это, я реализовал только один интерфейс и создал в нем объект io_service, все еще вызывающий опрос из потока графического интерфейса пользователя и который работает.

Мой вопрос: возможно ли, что существует общая проблема с передачей объекта io_service в DLL-функции, загруженные во время выполнения?

Если сценарий слишком неясен, я приведу минимальный пример.

EDIT: Я чувствую себя действительно глупо :) Просто взломал минимальный пример, и это, конечно, работает как шарм. Это в значительной степени означает, что проблема возникает из какой-либо другой части программного обеспечения.

Так что спасибо всем за их вклад!

Для того, чтобы этот вопрос, по крайней мере, немного полезно: Любой, кто хочет сделать что-то подобное (плагины для сети синхронизируются через повышение :: ASIO :: io_service), вы можете скачать минимальный пример here.

+1

Сценарий ясен, но пример, безусловно, поможет. –

+0

Нет ничего плохого в использовании одного и того же io_service любым количеством DLL, и что гораздо больше, его можно использовать любым количеством потоков (если вы знаете, что вы делаете). поэтому, пожалуйста, укажите образец запуска асинхронных операций и опроса –

+0

Да, похоже, я допустил ошибку в каком-то другом месте. Этот сценарий должен работать без проблем. – LiMuBei

ответ

2

Я бы проверил несколько вариантов:
* Возможно, объект скопирован в какой-то момент, а не передан по ссылке; вы можете сделать его boost :: noncopyable, чтобы это не происходило.
* Проверьте возвращаемое значение опроса, если оно больше 0, был запущен некоторый обработчик; если это 0, проблема в том, что у нас нет обработчика.
* Добавить тестовый обработчик в вашем графическом приложении, чтобы исключить этот параметр, связанный с DLL.

Удаленная отладка!

+0

Поскольку в сценарии нет общей проблемы, и мне просто нужно лучше отладить мое программное обеспечение, я собираюсь отметить это как правильный ответ. Благодаря! – LiMuBei

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