Я использую ncurses для написания текстового клиента на языке C. Основной цикл программы просто блокируется до тех пор, пока не будет обнаружено нажатие клавиши, а затем обрабатывает его и продолжает ждать следующего нажатия клавиши.
У меня естьодин поток, который я запускаю (опубликовано ниже), который блокирует (используя select) ожидание ввода с сервера, а когда он получает, добавляет его в буфер журнала чата и выводит буфер на экран.Он отлично работает.
Я знаю, что ncurses не является потокобезопасным, но я понимаю, что потоки таковы, что пока я на 100% уверен, что только один поток делает вызовы ncurses одновременно, он будет работать нормально.
Моя проблема связана с позицией курсора.
Она изменяется строкой move(height+1, curx);
, и независимо от того, какие значения я ей передаю, ncurses, похоже, полностью игнорирует вызов и помещает мой курсорв другой позиции.Кажется, я не могу повлиять на это.
Для дальнейшего объяснения проблемы в моем основном потоке (цикл нажатия клавиш) я использую ту же блокировку мьютекса.Когда курсор обновляется в этих разделах кода, он работает как запланировано.Когда он обновляется из потока получения ниже, вызов курсора игнорируется.
Есть идеи?
receive thread</p>
<pre><code> 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);
}