我正在使用ncurses在C中编写基于文本的客户端。程序的主循环只是阻塞,直到检测到按键然后处理它并继续等待另一个按键。
我有一个我启动的单个帖子(在下面发布)阻止(使用select)等待来自服务器的输入,当它收到它时,它将它添加到聊天记录缓冲区并将缓冲区打印到屏幕上。它运作得很好。
我知道ncurses不是线程安全的,但我对线程的理解是,只要我100%确定一次只有一个线程调用ncurses,它就能正常工作。
我的问题在于光标位置。
使用行move(height+1, curx);
修改它,无论我传递给它的是什么值,ncurses似乎完全忽略了调用并将光标放在不同的位置。我似乎无法影响它。
为了进一步解释这个问题,在我的主线程(按键循环)中,我使用了相同的互斥锁。当光标在代码的这些部分中更新时,它按计划工作。从下面的接收线程更新时,将忽略光标调用。
有什么想法吗?
receive thread
char buf[512];
fd_set read_fds;
FD_ZERO(&read_fds);
int nbytes;
for (;;) {
read_fds = master;
select(sockfd+1, &read_fds, NULL, NULL, NULL);
pthread_mutex_lock(&mutexdisplay);
memset(&buf, 0, sizeof buf);
nbytes = recv(sockfd, buf, 512, 0);
buf[nbytes] = 0;
add_chatmsg(chatlog, &numchatlog, buf);
// erase window
werase(chat_window);
// redraw border
wborder(chat_window, '|', '|', '-', '-', '+', '+', '+', '+');
// scroll completely into the future
chatlogstart = numchatlog-1;
// print the chat log
print_chatlog(chatlog, &numchatlog, &chatlogstart, &height);
move(height+1, curx);
// refresh window
wrefresh(chat_box);
wrefresh(chat_window);
pthread_mutex_unlock(&mutexdisplay);
}
char buf[512];
fd_set read_fds;
FD_ZERO(&read_fds);
int nbytes;
for (;;) {
read_fds = master;
select(sockfd+1, &read_fds, NULL, NULL, NULL);
pthread_mutex_lock(&mutexdisplay);
memset(&buf, 0, sizeof buf);
nbytes = recv(sockfd, buf, 512, 0);
buf[nbytes] = 0;
add_chatmsg(chatlog, &numchatlog, buf);
// erase window
werase(chat_window);
// redraw border
wborder(chat_window, '|', '|', '-', '-', '+', '+', '+', '+');
// scroll completely into the future
chatlogstart = numchatlog-1;
// print the chat log
print_chatlog(chatlog, &numchatlog, &chatlogstart, &height);
move(height+1, curx);
// refresh window
wrefresh(chat_box);
wrefresh(chat_window);
pthread_mutex_unlock(&mutexdisplay);
}
答案 0 :(得分:0)
对于回答这个问题可能为时已晚。
您没有指定要控制光标的窗口。我假设您希望将光标放在chat_box或chat_window的(height + 1,curx)位置。
可以在stdout widow中使用move funtion来控制光标,这是原始终端,但不是你创建的windows(chat_box和chat_window)。在用户创建的窗口中控制光标的功能是wmove。
int move(int y,int x);
int wmove(WINDOW * win,int y,int x);
希望这有助于其他人面临类似的问题。如果这不是正确的解决方案,请指出。