Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Были ли попытки обернуть асинхронный ввод-вывод WinAPI в классы C++?

350
15 июня 2010 года
cheburator
589 / / 01.06.2006
Сабж в том, что нужно прогарантировать валидность буферов и структуры OVERLAPPED на время выполнения операции, а также, если используются CompletionPort, обеспечить потокобезопасность. При этом желательно обеспечить повторное использование буферов и OVERLAPPED и hEvent в OVERLAPPED, чтобы многократно не заниматься выделением памяти в куче и обращением к ядерным функциям.
Сам сейчас этим занимаюсь. Кстати, возникает вопрос: можно ли тут разместить вопрос, который не совсем вопрос, а скорее призыв к обсуждению и участию в небольшом проекте, а под ответами подразумеваются сообщения об ошибках, глюках, и просто глупостях и предложения оптимизации.
Параллельно с библиотекой async будет писаться статья по асинхронному вводу-выводу и выкладываться исходник.
И если уж такая пьянка, есть проблема: нужен контейнер, который не выделяет память под каждый объект (в отличие от list), но быстро удаляет элементы в произвольной позиции (в отличии от vector, deque). Быстрое добавление только в конец подойдёт. Быстрый поиск - плюс, но не обязательный.
5
15 июня 2010 года
hardcase
4.5K / / 09.08.2005
Взять модель IAsyncResult из .NET?

Вообще, на мой взгляд качественный асинхронный код без монад, которые я даже не представляю как организовать в C++ (аналогично тому, что я видел в F# или Nemerle), невозможен.
350
15 июня 2010 года
cheburator
589 / / 01.06.2006
В данный момент гарантия валидности буферов и OVERLAPPED делается через std::vector<boost::shared_ptr<класс,содержащийOVERLAPPED+буфер> >. Вектор сидит в объекте-файле/сокете/..., гарантируя неудаление буфера, пока объект существует.
Но проблемы есть. С утра выложу наброски кода. Код частично работоспособен (проверялся).

Код во вложении.
Коммент: там инклюдится boost/smart_ptr.hpp - из известной библиотеки, найти её можно по адресу boost.org, а #include "general.h" подключает класс Event - обёртку винапишных Event'ов.
Сначала хотел сделать ещё и CompletionPort, теперь решил от них отказаться...

П.С. добавляю код-пример использования, правда, там версия, где ещё был CompletionPort
3
19 июня 2010 года
Green
4.8K / / 20.01.2000
Не совсем понятно, о чем тема.
О существующих библиотеках С++ для работы с асинхронными сокетами?
Да, такие библиотеки есть. Тот же Boost.Asio. Есть и другие.

Если вопрос о специфичном контейнере, "который не выделяет память под каждый объект", то надо смотреть в сторону пулов. На сколько я помню std::stack обладает чем-то похожим, но надо проверить. Ну и опять же Boost Pool Library.

Ну и про overlapped. Структура связана в данном случае с сокетом. Создали сокет - создали и структуру для него, убили сокет - убили и соотв. структуру.
350
19 июня 2010 года
cheburator
589 / / 01.06.2006
Первая часть вопроса понята верно, спасибо за ссылки.
Вторая часть: контейнер нужен хитрый и нестандартный - организация памяти как у вектора/стека/дека (выделение памяти только при расширении), функциональность как у листа (возможность удалить из середины без физического сдвига объектов).
Третья часть: выложен код, просьба глянуть и прокомментировать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог