如何在C ++中编写一个好的Wait()函数

时间:2013-12-03 14:10:19

标签: c++ sleep

我正在编写程序的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的要求,我无权改变。

2 个答案:

答案 0 :(得分:1)

正如其他人所指出的,你不能没有阻止地等待。阻止是整个等待点。

我会仔细查看IClient并阅读任何文档,以确保没有可以让您异步执行此操作的功能。

如果你没有运气,那么你就可以在你的代码中做一个睡眠循环。如果你可以使用c ++ 11那么克里斯给了一个很好的建议。否则你将留下你的操作系统给你的任何东西。在POSIX系统(unix)上,您可以尝试使用usleep()或nanosleep()来让您比睡眠时间更短()http://linux.die.net/man/3/usleep

答案 1 :(得分:0)

如果要在不切换到另一个线程的情况下进行连接,可以使用特定于系统的选项。例如,connect之前的setsockopt() for SO_RCVTIMEO选项将帮助您使用linux。您可以尝试找到将预配置套接字传递给相关库的方法。