gpt4 book ai didi

使用 curses.h 库的光标跳转

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:56 26 4
gpt4 key购买 nike

我有一个项目使用 curses 和 sockets 制作一个会说话的程序。基本上主线程启动两个线程来管理屏幕的两半和另一个线程来管理通过网络发送/接收。代码看起来很干净,但由于某种原因,光标有时似乎随机地在屏幕上跳来跳去。通常在它的三排左右会开始到处跳跃。我没有来自 curses 的 mv___() 函数,所以我很困惑为什么光标会在我身上流氓。

这里是两个线程调用的函数,用来管理屏幕的两侧。关于可能导致这种情况的原因有什么想法吗?

void *display(int sub)
{
int bufSize = 10;
char* buf = (char*)calloc(bufSize, sizeof(char));

while(read(displayPipe[sub][0], buf, 1) > 0)
{
sem_wait(&displaySem);

waddch(subWin[sub], buf[0]);
wrefresh(subWin[sub]);

sem_post(&displaySem);
}

free(buf);

return NULL;

这是从套接字读取的函数

void *netToPipe()
{
int bufSize = 10;
char* buf = (char*)calloc(bufSize, sizeof(char));

// read from talkfd
while(read(talkfd, buf, 1) != EOF)
{
// print to the bottom of the screen
if(write(displayPipe[1][1], buf, 1) < 0)
(void)printf("Error writing to talkfd\n");
}

free(buf);

return NULL;
}

这是 main() 的结尾,它正在从键盘读取并写入屏幕底部(通过管道)和套接字。

while(1)
{
// get a key from the subwindow
key = wgetch(subWin[0]);

// we are connected to a client
if(talkfd > 0)
{
// send across network
write(talkfd, &key, 1);
// copy to upper portion of the screen
write(displayPipe[0][1], &key, 1);
}
// we are just talking to self
else
{
// send to bottom of screen
write(displayPipe[1][1], &key, 1);
// send to top of screen
write(displayPipe[0][1], &key, 1);
}
refresh();

}

最佳答案

考虑到你的程序已经设置了大量的限制,我认为你能做的绝对最好的就是限制所有 curses将函数分配给单个线程——所有输入、所有输出、所有重新绘制等。保持 IO 线程专用于网络 IO,绝不用于任何基于 curses 的控制台IO。因为我关心检查的平台上的 stock curses 不支持多线程操作,所以仍然不能保证你可以用这种方式编写出没有错误的程序,但这是你最好的选择。

一种类似且更像 Unix 的方法是使用多个进程 而不是线程。这样, protected 内存就不会让不同的进程意外地在 curses 全局或静态存储上涂鸦,并且您更有可能编写无错误的软件。

当然, Unix-ish 方法会使用 libeventlibev在一个线程和一个进程中多路复用所有 IO。 (但这也可能与 curses 一起工作时遇到问题。这是一个令人惊叹的软件,它的根植于 30 年前......)

关于使用 curses.h 库的光标跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8394795/

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