std::this_thread::sleep_for()冻结程序



我正在制作一个加载类型的函数,所以我想做的是暂停程序几秒钟,然后在循环中恢复执行,使其看起来像一个加载过程。在网上查找时,我发现我可以使用std::this_thread::sleep_for()来实现这一点(我在linux上这样做(。我面临的问题是,我无法使用r或任何其他方式来覆盖最后输出的百分比,因为程序一执行就冻结了,但它与n完美配合,很难理解为什么它与换行序列配合使用,而与r不配合使用。

我在下面发布了示例代码,有人能告诉我我做错了什么吗?

#include<iostream>
#include<chrono>
#include<thread>
int main()
{
for (int i = 0; i<= 100; i++)
{
std::cout << "r" << i;
std::this_thread::sleep_for(std::chrono::seconds(rand()%3));
}
return 0;
}

我对这个话题有点陌生,经过一番挖掘,我发现我在扰乱话题。但仍然不确定为什么会发生这种行为。

这在我的机器(Windows 10(上运行良好:

#include <iostream>
#include <chrono>
#include <thread>
#include <cstdlib>
#include <ctime>

int main( )
{
std::srand( std::time( 0 ) );
for ( std::size_t i { }; i < 100; ++i )
{
std::cout << 'r' << i;
std::this_thread::sleep_for( std::chrono::seconds( std::rand( ) % 3 ) );
}
}

我建议你写'r'而不是"r",因为这里你只想打印r字符,而"r"实际上打印两个字符(r(
此外,在调用rand之前,最好使用srand对其进行种子处理。

然而,在某些环境中,它可能无法按预期工作,因此您可能需要刷新输出序列,如下所示:

std::cout << 'r' << i << std::flush;

或者像这样:

std::cout << 'r' << i;
std::cout.flush( );

这些是等效的。

有关flush的更多信息,请参阅此处。

最新更新