我正在编写程序的C ++ API的包装器,它需要连接到网络。我希望自己的Connect()函数等待2秒或更短时间,如果没有建立连接则继续。我想到的只是使用Sleep(...)
并再次检查,但这不起作用:
class MyWrapperClass
{
IClient* client;
bool MyWrapperClass::Connect()
{
client->Connect();
int i = 0;
while (i++ < 20 && !client->IsConnected())
Sleep(100); /* Sleep for 0.1 s to give client time to connect (DOESN'T HAPPEN) */
return client->IsConnected();
}
}
我假设这失败了(即没有建立连接)因为整个线程停止了,包括IClient::Connect()
方法。我无法访问此方法,因此无法验证是否启动任何其他线程或任何其他操作。
有一个更好的方法让一个函数等待而不用阻塞任何东西吗?
修改
要使问题复杂化,请考虑以下事项:程序必须使用/clr
进行编译,因为API要求这样做(因此std::thread
无法使用)和{{1} }不能是一个非托管类(即IClient
不合法),因为该类包含非托管的东西。根据API的要求,我无权改变。
答案 0 :(得分:1)
正如其他人所指出的,你不能没有阻止地等待。阻止是整个等待点。
我会仔细查看IClient并阅读任何文档,以确保没有可以让您异步执行此操作的功能。
如果你没有运气,那么你就可以在你的代码中做一个睡眠循环。如果你可以使用c ++ 11那么克里斯给了一个很好的建议。否则你将留下你的操作系统给你的任何东西。在POSIX系统(unix)上,您可以尝试使用usleep()或nanosleep()来让您比睡眠时间更短()http://linux.die.net/man/3/usleep。
答案 1 :(得分:0)
如果要在不切换到另一个线程的情况下进行连接,可以使用特定于系统的选项。例如,connect之前的setsockopt() for SO_RCVTIMEO选项将帮助您使用linux。您可以尝试找到将预配置套接字传递给相关库的方法。