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

How to write a good Wait() function in C++

本文关键字:一个 函数 Wait C++      更新时间:2023-10-16

我正在围绕一个需要连接到网络的程序的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不能使用(,并且IClient不能是非托管类(即 IClient^ client = gcnew IClient()不合法(,因为该类包含非托管内容。我也没有能力改变,因为它是API所要求的。

正如其他人指出的那样,你不能等待而不阻止。阻止是等待的全部意义。

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

如果你没有运气,那么你只能在代码中做一个睡眠循环。如果你能用c++11,那么Chris给出了一个很好的建议。否则,您将拥有操作系统为您提供的任何内容。在POSIX系统(unix(上,你可以尝试usleep((或nanosleep((给你比sleep((更短的睡眠时间,见 http://linux.die.net/man/3/usleep。

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