1

所以,我想做的是在 C++ 中创建一个函数,允许用户在一段时间内(例如,十分钟(甚至一分钟))将任何内容输入到字符串中(并保留他们所有的东西输入,顺便说一句。我正在尝试设计一个游戏来帮助 NaNoWriMo 参与者或作者推动他们写作,所以保留一切是必不可少的),然后不允许附加任何输入。起初这听起来很容易,但五个小时的谷歌搜索证明并非如此。

首先,我认为我可以重复追加,直到时间用完或其他东西。观察:

int main() //testing
{
    string str;
    string app = " ";
    getline(cin, app);

    for (int i = 0; i <= 3; i++)
    {
        Sleep(5000);
        cout << i << endl;
        str = " ";
        getline(cin, str);
        app.append(str);
    }

    cout << app;
}

但后来我意识到,呃,在用户按下回车之前,循环不会再次检查条件。麻烦。与我对角色的聪明想法相同。我需要一个循环来更新每个输入的字符(或每隔一秒),无论用户输入另一个字符需要多长时间。

所以,然后我想,“好吧,在每个空间停下来更新时间应该足够好,是吗?”

这是我开始发现 C++ 在解析字符串或读取输入时表现不佳的时候。我考虑过附加每个字符,因为这很容易找到一个空格,但它仍然在等待用户。

沮丧,我想知道是否有一种方法可以让程序在获取用户输入的同时同时运行,以便一旦时间用完(使用时间(空),时间过去,时间(空)并减去两个变量以获得经过的秒数) .

原来,有!(考虑到所有使用此原理的计算机程序和游戏,我知道必须有,但我对编程很陌生(我上周三学习了函数,给你一个想法),所以我不知道是什么.)

我偶然发现的第一个函数是 curses 和 ncurses,但我很快发现这对于我想做的事情来说确实不是一个可行的选择(因为我听说它做了一些很有趣的事情)。

然后我偶然发现了 kbhit,它可以识别何时按下键盘上的键。这个博客似乎很有希望,也可能是我想做的,但我不确定它是用什么语言编写的。. . 我所知道的是它不能很好地与我的 C++ IDE 配合使用。我不知道如何使它与 C++ 配合得很好。

所以,重申一下我想要的:

一个包含同时执行时间计数器和用户输入(到字符串)的循环,但在时间用完时终止(停止让用户进一步输入到字符串)。(所有这些都没有对我的程序的其余部分做有趣的事情,就像 ncurses 那样。)

另外:我运行 Windows 8(我存在的祸根)并使用 Code::Blocks 作为我的 IDE。

或者,如果你知道了,这个问题已经在某个地方得到了回答。那实际上会很棒。找不到它只会让我觉得很傻。

(以下是我沿途看过的一些地方:

程序仍在运行时的用户输入

在按下空格或制表符之前,如何从标准输入中读取输入?

从标准输入中捕获字符而无需等待按下回车

(我正在尝试创建的游戏,(还不是很远;我昨晚开始玩),以防你好奇:https ://github.com/Rowan-Law/Dungeon-Crawl/blob /master/Source%20代码

4

3 回答 3

1

您可能想为时间创建一个线程,然后继续更新字符串,直到时间线程返回

于 2015-02-22T08:13:55.367 回答
0

多线程是解决方案。在基本级别,C++ 控制台应用程序std::cin仅在输入时使用更新(正如我和 Christian Hackl 指出的那样),所以如果没有线程,我想做的事情是不可能的。

我知道这个问题已经很老了,但我希望这个答案可以为其他新手节省大量时间在网上搜索不存在的答案!

于 2018-12-02T02:11:15.013 回答
0

以下是使用线程在 C++17 中获得非常接近所需内容的方法。唯一的问题是用户仍然可以在时间限制后输入,只是不会被保存。

#include <atomic>
#include <chrono>
#include <iostream>
#include <istream>
#include <mutex>
#include <ostream>
#include <string>
#include <thread>

std::atomic_bool done = false;
std::mutex cout_mutex{};

void Timing(std::chrono::seconds length) {
    auto start = std::chrono::steady_clock::now();
    auto end = start + length;
    auto now = std::chrono::steady_clock::now();
    while(now < end) {
        now = std::chrono::steady_clock::now();
        done = false;
    }
    done = true;
    {
        std::scoped_lock<std::mutex> lock(cout_mutex);
        std::cout << "\nTime's up! Any unsaved input will be lost." << std::endl;
    }
}

int main() {
    std::string str{};
    std::string app{};

    using namespace std::literals::chrono_literals;
    //This can be any duration you want.
    std::thread t = std::thread(Timing, 30s);
    t.detach();
    while(!done) {
        std::getline(std::cin, str);
        if(!done) {
            app.append(str + '\n');
        }
    }
    std::cout << app;
}
于 2018-12-02T18:57:11.470 回答