【问题标题】:Perform Infinite Loop While Waiting for Input等待输入时执行无限循环
【发布时间】:2015-05-08 13:24:34
【问题描述】:

执行此操作的 C++ 程序:

 cout<<"Hello please enter in your age: "; 
 int age;
 cin>>age; 

当系统等待输入时,我想显示以下循环:

for(;;)
{
 cout << "Waiting.............." << '\r' << flush; Sleep(500);
 cout << ".......Waiting......." << '\r' << flush; Sleep(500);
 cout << "..............Waiting" << '\r' << flush; Sleep(500);
}

当有任何输入时,循环应该停止。

【问题讨论】:

标签: c++ infinite-loop


【解决方案1】:

这对我有用

#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>

using namespace std;

void *PrintWaiting(void *id)
{
   for(;;)
   {
      cout << "Waiting.............." << '\r' << flush; sleep(1);
      cout << ".......Waiting......." << '\r' << flush; sleep(1);
      cout << "..............Waiting" << '\r' << flush; sleep(1);
   }
   pthread_exit(NULL);
}

int main ()
{
   pthread_t thread;

   pthread_create(&thread, NULL, PrintWaiting, NULL);

   int age;
   cout << "Hello please enter in your age: "; 
   cin >> age; 

   pthread_cancel(thread);

   cout << age << endl;

   pthread_exit(NULL);
}

使用-lpthread 标志编译。

它看起来会很奇怪,你必须弄清楚如何格式化输出

【讨论】:

    【解决方案2】:

    因为 cin 和 read 函数通常是阻塞操作,你不能做其他事情,因为你的主线程被“阻塞”了。

    这样做的唯一方法是创建另一个线程,该线程将打印到由全局变量控制的同一 STDOUT。基本上你需要这样的东西:

    //print thread
    while(global == 1)
    {
        cout<<"TEXT";
        ........
    }
    

    在主线程中:

    volatile int global = 0;
    ....
    global = 1;
    cin>>age;
    global = 0;
    

    这不是一个好习惯,但你可以从这个开始,但尝试使用 MUTEX 而不是全局变量

    【讨论】:

    • 在 C++ 中,您可以使用 std::thread 类来创建线程,也可以使用准备好的类 std::mutex 来创建互斥锁。
    • @Fireho 我讨厌 C++ 和 STL,所以我不太了解它的内容:D。您可以使用这些重写我的答案并发布它
    • volatile doesn't do what you think it does 不应用于同步或线程间通信
    • @Mgetz 我使用了 volatile ,因为某些编译器实际上会从内存中获取一次值,并且不会费心从 RAM 中重新获取它,而是会缓存它(甚至使用相同的寄存器)。主线程也一样,global = 0 可能只在寄存器/缓存中设置值,而不是在 RAM 中
    • @GabrielCiubotaru:但是如果您从不同的线程访问它,那么您还需要使用一些同步(例如互斥锁)或将其设为std::atomic&lt;int&gt;,这已经保证了 I/O ...在任何一种情况下都使volatile 变得多余。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2020-03-27
    • 2012-10-13
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多