Я использую стороннюю библиотеку, которая имеет функцию блокировки, то есть она не вернется, пока она не будет выполнена; Я могу установить тайм-аут для этого вызова.Метод вызова сразу после блокировки вызова
Проблема в том, что эта функция помещает библиотеку в определенное состояние. Как только он войдет в это состояние, мне нужно что-то сделать из своего собственного кода. Моим первым решением было сделать это в отдельной теме:
void LibraryWrapper::DoTheMagic(){
//...
boost::thread EnteredFooStateNotifier(&LibraryWrapper::EnterFooState, this);
::LibraryBlockingFunction(timeout_);
//...
}
void LibraryWrapper::EnterFooState(){
::Sleep(50); //Ensure ::LibraryBlockingFunction is called first
//Do the stuff
}
Довольно противный, не так ли? Мне пришлось поставить вызов Sleep
, потому что :: LibraryBlockingFunction обязательно нужно вызвать перед тем, что я делаю ниже, или все провалится. Но ждать 50 миллисекунд - довольно плохая гарантия, и я не могу ждать больше, потому что эта конкретная задача должна быть выполнена как можно быстрее.
Нет ли лучшего способа сделать это? Учтите, что у меня нет доступа к коду библиотеки. Ускорение решений приветствуется.
ОБНОВЛЕНИЕ: Как сказано в одном из ответов, API-интерфейс библиотеки не определен. Я отправил электронное письмо разработчикам, объяснив проблему и предложив решение (т. Е. Сделав вызов неблокирующим и отправив событие зарегистрированному обратному сообщению, уведомляющему об изменении состояния). Тем временем я установил тайм-аут достаточно высоким, чтобы обеспечить, чтобы материал X был выполнен, и установите задержку достаточно высоко, прежде чем выполнять работу после вызова, чтобы обеспечить выполнение функции библиотеки. Он не детерминирован, но работает большую часть времени.
Я смущен. Почему вы не можете сделать очевидное и просто делать то, что вам нужно сделать после того, как звонок блокировки вернулся? Почему вторая нить? –
@John: Я интерпретировал проблему как требующую изменения состояния после вызова, но до его возвращения. Я мог ошибаться, хотя ... –
@ Джон: Это похоже на Алекс. Мне нужно сделать это как можно скорее (аппаратные средства) –