当我从线程打印时,它使用 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 中给了我奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章