线程无法向curses屏幕正确打印玩家图标问题求助
问题排查与修复方案
核心问题点及修复步骤:
刷新函数拼写错误
代码中curse_refresh()是拼写错误,正确的curses刷新函数是refresh()。这个错误会导致所有屏幕绘制操作无法同步到终端,火箭自然不会显示。
修复:把所有curse_refresh()替换为refresh()。输入函数误用
使用标准IO的getchar()而非curses库的getch(),两者不兼容:getchar()依赖行缓冲,无法直接捕获KEY_UP这类特殊按键,还会阻塞curses的终端状态同步。
修复:将c = getchar();改为c = getch();。curses输入模式未正确配置
如果主线程没有初始化curses的输入模式,特殊按键无法被识别,输入操作也会异常。需要在主线程的curses初始化代码中添加:initscr(); // 初始化curses屏幕 cbreak(); // 禁用行缓冲,输入立即生效 keypad(stdscr, TRUE); // 启用特殊按键(如KEY_UP/KEY_DOWN)的捕获 noecho(); // 关闭输入字符回显,避免干扰游戏界面线程安全问题
curses库并非线程安全,若多个线程同时调用curses的绘制/刷新函数,会导致显示错乱。需要用互斥锁同步所有curses操作:- 全局定义互斥锁:
pthread_mutex_t curses_mutex; - 主线程初始化时创建互斥锁:
pthread_mutex_init(&curses_mutex, NULL); - 在所有调用curses函数的地方加锁解锁,比如:
pthread_mutex_lock(&curses_mutex); mvaddch(rocket1->row, rocket1->col, rock); refresh(); pthread_mutex_unlock(&curses_mutex); - 程序结束前销毁互斥锁:
pthread_mutex_destroy(&curses_mutex);
- 全局定义互斥锁:
检查
rock变量定义
确保rock是已正确定义的字符(比如#define rock '^'),未定义或空值会导致绘制无效。
修复后的核心函数示例:
void *run_rocket( void *rocket ) { object_t * rocket1 = (object_t *) rocket; int c; int row = rocket1->row; pthread_mutex_lock(&curses_mutex); mvaddch( rocket1->row, rocket1->col, rock ); refresh(); pthread_mutex_unlock(&curses_mutex); while( running ){ c = getch(); if( c == KEY_UP ){ row = row - 1; rocket1->row = row; pthread_mutex_lock(&curses_mutex); mvaddch( row+1, rocket1->col, ' ' ); mvaddch( row, rocket1->col, rock ); refresh(); pthread_mutex_unlock(&curses_mutex); } else if( c == KEY_DOWN ){ if( row!=bheight ){ row = row + 1; rocket1->row = row; pthread_mutex_lock(&curses_mutex); mvaddch( row-1, rocket1->col, ' ' ); mvaddch( row, rocket1->col, rock ); refresh(); pthread_mutex_unlock(&curses_mutex); } } else if( c == 'q' ){ running = false; } if( row == 0 ){ running = false; int hgt = bheight/2; pthread_mutex_lock(&curses_mutex); mvprintw( hgt, 0, "Congratulations! You won!"); mvprintw( (hgt - 1), 0, "Press 'q' to exit."); refresh(); pthread_mutex_unlock(&curses_mutex); } } destroy_rocket(rocket); return NULL; }
内容的提问来源于stack exchange,提问作者Ray Babich
相关产品推荐
相关产品推荐

