需要帮助ncurses游标和线程

时间:2010-08-03 22:21:19

标签: cursor pthreads mutex ncurses

我正在使用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); }

1 个答案:

答案 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);

希望这有助于其他人面临类似的问题。如果这不是正确的解决方案,请指出。