Существуют ли библиотеки для удобного программирования асинхронных вызовов?
Поясню задачу.
Допустим, есть GUI, где пользователь запускает задачу. Задача может выглядеть так:
some_quick_code1;
Load("http://url"); // has async interface too, can be used asynchronously
some_quick_code2;
ReadFromDataBase("select * from db"); // has async interface too, can be used asynchronously
some_quick_code3;
ComputeLargeData(); // has async interface too, can be used asynchronously
some_quick_code4;
WriteToDisk("out.txt"); // has async interface too, can be used asynchronously
some_quick_code5;
Пока все это выполняется, пользователь:
а) Может нажать "Отмена". Приложение все еще выполняется, но задачу уже можно прекращать.
б) Может вообще закрыть приложение. Работу приложения нужно завершить.
То есть выполнение всей задачи нужно уметь прерывать.
Предполагается, что у всех "долгих" функций есть еще и асинхронный интерфейс, который может уведомлять когда работа функции завершена, и также есть возможность послать асинхронно выполняющейся функции сигнал "прекратить работу".
Соответственно вопрос, как оформить приведенный выше код в асинхронном стиле?
Здравствуйте, sraider, Вы писали:
S>Существуют ли библиотеки для удобного программирования асинхронных вызовов?
S>а) Может нажать "Отмена". Приложение все еще выполняется, но задачу уже можно прекращать. S>б) Может вообще закрыть приложение. Работу приложения нужно завершить.
S>То есть выполнение всей задачи нужно уметь прерывать. S>Предполагается, что у всех "долгих" функций есть еще и асинхронный интерфейс, который может уведомлять когда работа функции завершена, и также есть возможность послать асинхронно выполняющейся функции сигнал "прекратить работу".
Для этого используется механизм кооперативной отмены. То есть работа прерывается не в одностороннем порядке вызывающей стороной; вызываемая сторона должна «согласиться» прерваться. Посмотри в MSDN реализацию и примеры использования .NET-классов CancellationToken и CancellationTokenSource, и сделай по аналогии в C++. Но для этого асинхронный API должен поддерживать вызовы с передачей токена отмены, и его опрос.
Здравствуйте, Qbit86, Вы писали:
S>>а) Может нажать "Отмена". Приложение все еще выполняется, но задачу уже можно прекращать. S>>б) Может вообще закрыть приложение. Работу приложения нужно завершить.
S>>То есть выполнение всей задачи нужно уметь прерывать. S>>Предполагается, что у всех "долгих" функций есть еще и асинхронный интерфейс, который может уведомлять когда работа функции завершена, и также есть возможность послать асинхронно выполняющейся функции сигнал "прекратить работу".
Q>Для этого используется механизм кооперативной отмены. То есть работа прерывается не в одностороннем порядке вызывающей стороной; вызываемая сторона должна «согласиться» прерваться. Посмотри в MSDN реализацию и примеры использования .NET-классов CancellationToken и CancellationTokenSource, и сделай по аналогии в C++. Но для этого асинхронный API должен поддерживать вызовы с передачей токена отмены, и его опрос.
все можно сделать проще,
работа уходит чего-то ждать, и если она была отменена — ей бросается исключение.
собственно работы с таймаутом делаются так же.
вместо исключения может быть код ошибки, но это так надежно, т.к. ее можно проигнорировать.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Abyx, Вы писали:
A>>работа уходит чего-то ждать, и если она была отменена — ей бросается исключение.
Q>Напиши пример, как «работе» бросить исключение.
Здравствуйте, Abyx, Вы писали:
A>>>работа уходит чего-то ждать, и если она была отменена — ей бросается исключение. Q>>Напиши пример, как «работе» бросить исключение. A>тривиальный пример — это boost::thread::interrupt
Никогда не использовал, посмотрел сейчас по диагонали доку — там тоже кооперативная отмена: есть interruption points, в которых вызывающая сторона проверяет, не была ли запрошена отмена. Если была, то прибивает себя исключением. Частная харкодная раелизация общей идеи (опрос «boost::this_thread::interruption_requested()» вместо «token.CancellationRequested»).
Здравствуйте, sraider, Вы писали:
S>Существуют ли библиотеки для удобного программирования асинхронных вызовов?
Общей, для работы и с файлами, и с сетью, и вообще с чем угодно, вроде сеансов с СУБД
на её клиентской либе, наверно, все-таки нет.
Но таковую можно расписать самому. Ключевыми элементами будт потоки, очередя.
Для каждого типа задачи свой поток, использующий асинхронные фреймворки конкретного типа
задачи, для файлов свои( в POSIX libaio), для сети свои (epoll/boost::asio). И поток управленец,который ставит задачи
в очередя, и отменяет их, высылая сигналы с номером задачи, потокам исполнителям(в POSIX, pthread_sigqueue/pthread_kill ).
через лямбды как в node.js в принципе можно. для большего удобства рантайм должен сам создавать synchronization points между операторами, что в C++ невохможно