我正在使用具有阻塞功能的第三方库,也就是说,它在完成之前不会返回;我可以为该呼叫设置超时。
问题是,该函数将库置于某种状态。一旦它进入那个状态,我需要用我自己的代码做一些事情。我的第一个解决方案是在单独的线程中执行此操作:
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 毫秒是一个很差的保证,我不能再等了,因为这个特定的任务需要尽快完成。
难道没有更好的方法来做到这一点吗?考虑到我无权访问图书馆的代码。欢迎使用 Boost 解决方案。
更新:就像其中一个答案所说,库 API 定义不明确。我向开发人员发送了一封电子邮件,解释了问题并提出了解决方案(即,使呼叫非阻塞并将事件发送到已注册的回调以通知状态更改)。同时,我设置了足够高的超时时间以确保完成 X 工作,并在执行调用后工作之前设置足够高的延迟时间以确保调用库函数。它不是确定性的,但在大多数情况下都有效。