加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C控制台输入块所以我不能杀死线程

发布时间:2020-12-16 07:10:33 所属栏目:百科 来源:网络整理
导读:我的程序有许多不同的线程处理不同的东西,其中一个处理用户输入. 其他线程阻塞调用的方式并不多,而阻塞调用的线程基于网络,因此在套接字关闭时会被中断或正常返回. 但是,用户线程调用std :: cin以获取用户输入.这样做的结果是当所有其他线程都死了时,用户线
我的程序有许多不同的线程处理不同的东西,其中一个处理用户输入.

其他线程阻塞调用的方式并不多,而阻塞调用的线程基于网络,因此在套接字关闭时会被中断或正常返回.

但是,用户线程调用std :: cin以获取用户输入.这样做的结果是当所有其他线程都死了时,用户线程仍然阻塞用户输入,并且只会在下次输入时死亡.

有没有办法让我检查在阻止之前是否有任何用户输入要抓取?

我理解cin.peek()存在,但根据我的经验,如果没有什么可读的话它会阻塞.假设我正确使用它

我的代码基本上是一个无限循环,在另一个线程切换条件变量时停止:

void doLoop()
{
    while (running) //running is shared between all threads and all others die quickly when it is false. It's set to true before the threads are started
    {
        string input = "";
        getline(cin,input);

        //Handle Input

    }
}

我在Windows上,使用VS2013,不能使用外部库.我正在使用windows.h和std.

解决方法

您可以做的是使用期货允许用户输入具有时间限制的内容.然后,您可以将此代码插入主循环中

#include <iostream>       // std::cout
#include <future>         // std::async,std::future
#include <chrono>         // std::chrono::milliseconds
#include <string>
using namespace std;


bool myAsyncGetline(string & result)
{
    std::cout<<"Enter something within the time limit"<<endl;
    getline(cin,result);
    return true;
}

int main()
{
  // call function asynchronously:
  string res;
  std::future<bool> fut = std::async (myAsyncGetline,res); 


  std::chrono::seconds span (20);
  if (fut.wait_for(span)==std::future_status::timeout)
    std::cout << "Too Late!";
  else
      cout<<"You entered "<<res<<" "<< endl;

  return 0;
}

这在VS2012中可用,因此您应该能够重现它.

输出是“工具迟到!”如果getline在超时(20s)后仍然有效,否则输出结果.

我认为,如果时间限制被击中,它就比杀死线程更简单,因为函数会自动停止.告诉我,如果您需要帮助将其集成到我现有的代码中,我可以提供帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读