在控制台中同时输入和输出

可见

一个线程,它将线程无限地打印到控制台,还有一个主线程正在从控制台获取用户输入,但是输入值与该线程的输出混合在一起。

C ++:Cout时为cin

确实给了我关于如何进一步发展的提示,但我无法提出自己的解决方案(因为我是c ++的新手)。

using namespace std;

mutex mtx;

void foo()
{
    while (1)
    {
        usleep(1000000);
        cout << "Cake\n";
    }
}

int main()
{
    mtx.lock();
    thread t1(foo);
    string x;
    while (true)
    {
        cin >> x;
        edit//fflush(stdin);
        cout << x << "\n";
    }
    t1.join();
    mtx.unlock();
    return 0;
}

编辑1:

确切地说,我真正想要的是

IN端子(目前

output:cake (which prints every second)
output:cake 
output:cake 
output:cake 
input:hi
output:hicake (still yet to give the enter it echo's the input to console)
output:cake 

我在终端中真正想要的是输入独立于输出

output:cake 
output:cake 
output:cake 
input:hi
output:cake 
output:cake 
input:hi(waiting still for enter)

//and when enter is pressed it should print to the console
output:hi
output:cake

注意:禁用回声没有帮助。

编辑2:我发布的答案具有数据处理功能,其中并发操作在给定命令上停止。

可见

能够提出一个使用所有给定输入的解决方案,希望对您有所帮助。

#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <cstring>
#include <mutex>
#include <string>
#include <chrono>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <thread>
/// reads a character from console without echo.
int getChar()
{
    struct termios oldattr;
    tcgetattr(STDIN_FILENO, &oldattr);
    struct termios newattr = oldattr;
    newattr.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
    const int ch = getchar();
    tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
    return ch;
}

class Console
{
  private:
    // mutex for console I/O
    std::mutex _mtx;
    // current input
    std::string _input;
    // prompt output
    std::string _prompt;

  public:
    Console() {}

    Console(const Console &) = delete;
    Console &operator=(const Console &) = delete;

    std::string read();

    void write(const char *text, size_t size);
    void write(const char *text) { write(text, strlen(text)); }
    void write(const std::string &text) { write(text.c_str(), text.size()); }
};

std::string Console::read()
{
    { // activate prompt
        std::lock_guard<std::mutex> lock(_mtx);
        _prompt = "> ";
        _input.clear();
        std::cout << _prompt << std::flush;
    }
    enum
    {
        Enter = '\n',
        BackSpc = 127
    };
    for (;;)
    {
        switch (int c = getChar())
        {
        case Enter:
        {
            std::lock_guard<std::mutex> lock(_mtx);
            std::string input = _input;
            _prompt.clear();
            _input.clear();
            std::cout << std::endl;
            return input;
        } // unreachable: break;
        case BackSpc:
        {
            std::lock_guard<std::mutex> lock(_mtx);
            if (_input.empty())
                break;
            _input.pop_back();
            std::cout << "\b \b" << std::flush;
        }
        break;
        default:
        {
            if (c < ' ' || c >= '\x7f')
                break;
            std::lock_guard<std::mutex> lock(_mtx);
            _input += c;
            std::cout << (char)c << std::flush;
        }
        break;
        }
    }
}

void Console::write(const char *text, size_t len)
{
    if (!len)
        return;
    bool eol = text[len - 1] == '\n';
    std::lock_guard<std::mutex> lock(_mtx);
    // remove current input echo
    if (size_t size = _prompt.size() + _input.size())
    {
        std::cout
            << std::setfill('\b') << std::setw(size) << ""
            << std::setfill(' ') << std::setw(size) << ""
            << std::setfill('\b') << std::setw(size) << "";
    }
    // print text
    std::cout << text;
    if (!eol)
        std::cout << std::endl;
    // print current input echo
    std::cout << _prompt << _input << std::flush;
}

struct Flags //this flag is shared between both the threads
{
    // flag: true then exit communication thread and main loop
    bool exit;
    // flag: true then start data processing
    bool start;
    // the mini console
    Console console;

    // constructor.
    Flags() : exit(false), start(true) {}
};

void dataProc(Flags &shared)
{
    int i = 0;
    while (!shared.exit)
    {
        while (!shared.start)
        {
            if (shared.exit)
                return;
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
        shared.console.write("Starting data processing.");
        for (;;)
        {
            if (!shared.start || shared.exit)
            {

                shared.console.write("Data processing stopped.");
                while (!shared.start || shared.exit)
                {
                    if (shared.exit)
                        return;
                    std::this_thread::sleep_for(std::chrono::milliseconds(100));
                }
                shared.console.write("Data processing restarted.");
            }
            std::this_thread::sleep_for(std::chrono::milliseconds(250));
            {
                std::ostringstream fmt;
                fmt << "Cake " << ++i;
                shared.console.write(fmt.str());
            }
        }
        shared.console.write("Data processing done.");
        shared.start = false;
    }
}

void processInput(const std::string &input, Flags &shared)
{

    if (strcasecmp(input.c_str(),"start")==0)
        shared.start = true;
    else if (strcasecmp(input.c_str(),"stop")==0)
        shared.start = false;
    else if (strcasecmp(input.c_str(),"exit")==0)
        shared.exit = true;
    else if (input.size())
        shared.console.write("Wrong command!");
}




int main()
{
    Flags shared;
    std::thread threadProc(&dataProc, std::ref(shared));

    while (!shared.exit)
    {
        shared.console.write("Commands accepted: start stop exit");
        std::string input = shared.console.read();
        processInput(input, shared);
    }
    threadProc.join();
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

sink()同时在控制台中显示输出

来自分类Dev

使用点积的脚本和控制台中的输出不同

来自分类Dev

使用点积的脚本和控制台中的输出不同

来自分类Dev

在控制台中同时查看到文件的同时回显输出

来自分类Dev

Java输入控制台中的输入数字

来自分类Dev

将整个脚本输出重定向到文件并同时在控制台中显示

来自分类Dev

ESLint同时输出到文件和控制台

来自分类Dev

在R控制台中输出R代码

来自分类Dev

Eclipse控制台中的时间输出

来自分类Dev

Rails控制台中的整数不同输出

来自分类Dev

Shift + Enter与在控制台中输入

来自分类Dev

控制台中输入错误意外结束?

来自分类Dev

NodeJs 在控制台中处理用户输入

来自分类Dev

如何在R控制台中显示和输入中文(和其他非ASCII)字符?

来自分类Dev

是否可以在Windows控制台中输出和显示U + 2717(BALLOT X)?

来自分类Dev

文件和控制台中具有stdOut / StdErr输出的后台进程

来自分类Dev

如何区分 Javascript 控制台中的 console.error 输出和抛出的异常

来自分类Dev

stdout 中的输出在 cmd 和 Python 控制台中有所不同

来自分类Dev

Netbeans和控制台中的未知字符

来自分类Dev

在控制台上同时输出stderr和stdout并将它们同时存储在文件中

来自分类Dev

无法在Chrome控制台中使用javascript设置焦点和光标以输入文本

来自分类Dev

终端/控制台中的Python控制输出位置

来自分类Dev

在Python中同时在控制台中打印2行

来自分类Dev

如何在控制台中同时显示CJK lang?

来自分类Dev

Chrome控制台中的Java脚本同时循环停止行为

来自分类Dev

在验证用户输入的同时保持对控制台输入的控制

来自分类Dev

如何在控制台中获取Google-glog输出?

来自分类Dev

如何在Symfony控制台中禁用命令的输出?

来自分类Dev

NetBeans控制台中带有ansicodes的彩色输出

Related 相关文章

  1. 1

    sink()同时在控制台中显示输出

  2. 2

    使用点积的脚本和控制台中的输出不同

  3. 3

    使用点积的脚本和控制台中的输出不同

  4. 4

    在控制台中同时查看到文件的同时回显输出

  5. 5

    Java输入控制台中的输入数字

  6. 6

    将整个脚本输出重定向到文件并同时在控制台中显示

  7. 7

    ESLint同时输出到文件和控制台

  8. 8

    在R控制台中输出R代码

  9. 9

    Eclipse控制台中的时间输出

  10. 10

    Rails控制台中的整数不同输出

  11. 11

    Shift + Enter与在控制台中输入

  12. 12

    控制台中输入错误意外结束?

  13. 13

    NodeJs 在控制台中处理用户输入

  14. 14

    如何在R控制台中显示和输入中文(和其他非ASCII)字符?

  15. 15

    是否可以在Windows控制台中输出和显示U + 2717(BALLOT X)?

  16. 16

    文件和控制台中具有stdOut / StdErr输出的后台进程

  17. 17

    如何区分 Javascript 控制台中的 console.error 输出和抛出的异常

  18. 18

    stdout 中的输出在 cmd 和 Python 控制台中有所不同

  19. 19

    Netbeans和控制台中的未知字符

  20. 20

    在控制台上同时输出stderr和stdout并将它们同时存储在文件中

  21. 21

    无法在Chrome控制台中使用javascript设置焦点和光标以输入文本

  22. 22

    终端/控制台中的Python控制输出位置

  23. 23

    在Python中同时在控制台中打印2行

  24. 24

    如何在控制台中同时显示CJK lang?

  25. 25

    Chrome控制台中的Java脚本同时循环停止行为

  26. 26

    在验证用户输入的同时保持对控制台输入的控制

  27. 27

    如何在控制台中获取Google-glog输出?

  28. 28

    如何在Symfony控制台中禁用命令的输出?

  29. 29

    NetBeans控制台中带有ansicodes的彩色输出

热门标签

归档