1

ユーザー入力に readline (ブロッキング) を使用しているときに、テキスト行を別のスレッドから非同期でコンソールに出力したいと考えています。さらに、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

観察された出力: (input "foo\nbar\n" をゆっくりと入力)

? tick
ftick
otick
otick

? tick
tick
bartick
tick

? tick
^C

望ましい出力: (input "foo\nbar\n" をゆっくりと入力)

tick
tick
tick
tick
tick
? foo

tick
tick
tick
tick
tick
? bar

tick
? ^C
4

2 に答える 2

1

私は自分のプログラム omphalos ( https://github.com/dankamongmen/omphalos ) のコンソール バージョンでこれを行っています。この特定のコードはhttps://github.com/dankamongmen/omphalos/blob/master/src/ui/tty/tty.cからのものです。

私は持っている:

// Call whenever we generate output, so that the prompt is updated
static inline void
wake_input_thread(void){
    if(input_tid){
            pthread_kill(*input_tid,SIGWINCH);
            rl_redisplay(); // FIXME probably need call from readline contex
    }
    pthread_mutex_unlock(&promptlock);

}

static inline void
clear_for_output(FILE *fp){
    fputc('\r',fp);
}

何かを印刷したいときはいつでも、ロックを取得して clear_for_output() を呼び出し、カーソルを現在の行の先頭に移動します。rl_set_prompt() を呼び出すことにより、必要に応じてこの時点でプロンプトを変更できます。完了すると、wake_input_thread() が呼び出され、ロックが解除されて再表示されます。

これが 1 行以上のテキストを入力した場合に機能するかどうかはわかりませんが、それを疑っており、現時点で新しく憂鬱なバグである可能性が高いものを正式に発見することは気にしません。それを自分で実験してください。

于 2012-06-11T00:08:23.877 に答える