GNU Readline(libreadline):异步显示输出消息

问题描述 投票:1回答:2

虽然使用readline(阻止)进行用户输入,但我想从另一个线程异步将文本行输出到控制台。此外,我希望从控制台中删除readline提示符和当前的部分输入行,写入输出行,然后恢复readline提示符和部分用户行-以便使输出看起来像写在“上面”提示。

通过读取行​​重新显示功能的组合(或其他方式)可以实现?

(重新显示功能文档:http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC35

问题演示

    #include <readline/readline.h>
    #include <readline/history.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <pthread.h>

    bool run = true;

    void* log_thread(void*)
    {
            while (run)
            {
                    sleep(1);
                    // WHAT TO DO HERE?
                    write(1, "tick\n", 5);
            }
    }

    int main()
    {
            pthread_t t;
            pthread_create(&t, 0, log_thread, 0);

            while (true)
            {
                    char* p = readline("? ");
                    free(p);

                    if (!p)
                            break;
            }

            run = false;
            pthread_join(t,0);
    }

构建

$ g++ -pthread -lreadline test.cpp
$ ./a.out

观察到的输出 :(输入“ foo \ nbar \ n”输入缓慢)

? tick
ftick
otick
otick

? tick
tick
bartick
tick

? tick
^C

所需的输出 :(输入“ foo \ nbar \ n”输入缓慢)

tick
tick
tick
tick
tick
? foo

tick
tick
tick
tick
tick
? bar

tick
? ^C
c linux gnu readline libreadline
2个回答
© www.soinside.com 2019 - 2024. All rights reserved.