gpt4 book ai didi

c - GNU 阅读线 (libreadline) : Displaying output message asynchronously

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:02 24 4
gpt4 key购买 nike

在使用 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

观察到的输出:(慢慢输入“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

最佳答案

我正在我的程序 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(),释放锁并重新显示。

我不确定这是否适用于您输入了不止一行文本的情况,并且对此表示怀疑,并且现在不想正式发现这可能是一个令人沮丧的新错误,所以你可以自己试验一下。

关于c - GNU 阅读线 (libreadline) : Displaying output message asynchronously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com