在使用 readline(阻塞)进行用户输入时,我想从另一个线程异步地将文本行输出到控制台。此外,我希望从控制台中删除 readline 提示和当前部分输入行,写入输出行,然后恢复 readline 提示和部分用户行 - 以使输出看起来写在“上面”提示。
通过 readline redisplay 功能(或其他方式)的哪种组合可以实现这一点?
(重新显示函数文档: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