Совместное использование объекта boost :: asio :: io_service между динамически загружаемыми библиотеками - PullRequest
6 голосов
/ 26 января 2011

Первое, что я сделал (будет предоставлен минимальный образец, если не я просто сделаю что-то глупое):

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

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

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

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

РЕДАКТИРОВАТЬ: Я чувствую себя действительно глупо :) Просто взломали вместе минимальный пример, и это - конечно - работает как шарм. Это в значительной степени означает, что проблема возникает из какой-то другой части программного обеспечения.

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

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

1 Ответ

2 голосов
/ 01 февраля 2011

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

Счастливая отладка!

...