10

ちょっとしたプログラムを書きましたが、

int main(int argc, char *argv[])
{
    int n;
    std::cout << "Before reading from cin" << std::endl;

    // Below reading from cin should be executed within stipulated time
    bool b=std::cin >> n;
    if (b)
          std::cout << "input is integer for n and it's correct" << std::endl;
    else
          std::cout << "Either n is not integer or no input for n" << std::endl;
    return 0;
 }

からの読み取りstd::cinはブロックされているため、プログラムは、プログラムへの外部割り込み (シグナルなど) があるか、ユーザーが何らかの入力を提供するまで待機します。

std::cin >> nユーザー入力のためにステートメントをしばらく (おそらくsleep()システムコールを使用して)待機させるにはどうすればよいですか? ユーザーが入力を行わず、指定された時間 (たとえば 10 秒) が経過した後、プログラムは次の命令 (if (b==1)ステートメント以降) を再開する必要があります。

4

5 に答える 5

10

これは私にとってはうまくいきます(これはWindowsではうまくいかないことに注意してください):

#include <iostream>
#include <sys/select.h>

using namespace std;

int main(int argc, char *argv[])
{
    int n;
    cout<<"Before performing cin operation"<<endl;

    //Below cin operation should be executed within stipulated period of time
    fd_set readSet;
    FD_ZERO(&readSet);
    FD_SET(STDIN_FILENO, &readSet);
    struct timeval tv = {10, 0};  // 10 seconds, 0 microseconds;
    if (select(STDIN_FILENO+1, &readSet, NULL, NULL, &tv) < 0) perror("select");

    bool b = (FD_ISSET(STDIN_FILENO, &readSet)) ? (cin>>n) : false;

    if(b==1)
          cout<<"input is integer for n and it's correct"<<endl;
    else
          cout<<"Either n is not integer or no input for n"<<endl;

    return 0;
}
于 2013-08-31T20:06:05.707 に答える
0

クロスプラットフォームで、コンパクトで、c++11 標準以降で再利用可能な C++ 標準に基づくクリーンなソリューション

#include <iostream>
#include<thread>
#include<string>


class Timee_Limited_Input_Reader{ 
public:
   std::string Input;
   void operator()(){
    Timee_Limited_Input_Reader Input_Reader; 
    std::cout<<"enter inp"<<std::endl;
    std::thread Read_Input(&Timee_Limited_Input_Reader::Read,this);
    Read_Input.detach();
    std::this_thread::sleep_for(std::chrono::seconds(5));
    Read_Input.~thread();
   }
private:
   
   void Read(){
       Input = "nothing entered";
       
       std::cin>>Input;
       
   }
};
int main(){
   
   Timee_Limited_Input_Reader Input_Reader;
   Input_Reader();
   std::cout<<"Input Data : "<<Input_Reader.Input<<std::endl;
}
于 2021-10-10T11:34:30.013 に答える