当我从线程打印时,它使用 ncurses 在 C 中给了我奇怪的输出

Posted

技术标签:

【中文标题】当我从线程打印时,它使用 ncurses 在 C 中给了我奇怪的输出【英文标题】:When I print from a thread, it gives me weird output in C using ncurses 【发布时间】:2022-01-07 06:06:04 【问题描述】:

这是我使用的计时器线程:

void *timer(void *arg)
    
    current = time(0);
    stop = current + 30;
    while (1)
        current = time (0);
        if (current <= stop)
            now=stop-current;
            mvprintw(0,0,"%d",now);
            refresh();
        
    
    
    return NULL;

编辑(来自 cmets)...

我忘了提到我正在使用:

pthread_t timerth; pthread_create(&timerth, NULL, timer, NULL);  

我需要打印“timerleft”值,但输出如下所示:

有什么方法可以正常打印吗?我错过了什么吗?

感谢您的帮助。

【问题讨论】:

这能回答你的问题吗? Workaround for ncurses multi-thread read and write。有不止一种可能性,但最终这是重复的。 【参考方案1】:

也许您需要保存和恢复当前光标位置??

void *timer(void *arg) 
    int x, y;
    getyx(stdscr, y, x);

    /* ... */

    move(y, x);
    return NULL;

【讨论】:

同样的结果。我忘了提到我正在使用:pthread_t timerth; pthread_create(&timerth, NULL, timer, NULL); 哦,好吧!我认为值得一试。 好吧,如果其他任何东西同时使用屏幕,您就需要使用锁定。因为另一个线程可以在两者之间做一些事情 听起来不错,但是。你到底是怎么想的?我对编程比较陌生,所以我真的不知道该怎么做 @JakubKolesár 我认为 ikegami 建议您同步所有写入 ncurses 屏幕的操作。您可以对所有这些操作使用通用互斥锁:锁定互斥锁、写入屏幕、解锁互斥锁。【参考方案2】:

尝试像这样在打印字符串的末尾添加\r

mvprintw(0,0,"%d \r",now);

【讨论】:

还是一样的结果;/ 你试过没有坐标吗? mvprintw("%d \r",now);mvprintw("%d \r\n",now); 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于当我从线程打印时,它使用 ncurses 在 C 中给了我奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章

当我使用线程将内容打印到控制台时,为啥会产生奇怪的结果?

使用pthread时,字节仍可访问

为啥这个文本没有被 ncurses 着色?

在具有 ui/非 ui 线程差异的 WPF 中使用 PInvoke

当我使用线程时,PyQt5 中没有更新 GUI

当我从 .NET 生成一个新线程时到底发生了啥?