You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程无法向curses屏幕正确打印玩家图标问题求助

问题排查与修复方案

核心问题点及修复步骤:

  1. 刷新函数拼写错误
    代码中curse_refresh()是拼写错误,正确的curses刷新函数是refresh()。这个错误会导致所有屏幕绘制操作无法同步到终端,火箭自然不会显示。
    修复:把所有curse_refresh()替换为refresh()。

  2. 输入函数误用
    使用标准IO的getchar()而非curses库的getch(),两者不兼容:getchar()依赖行缓冲,无法直接捕获KEY_UP这类特殊按键,还会阻塞curses的终端状态同步。
    修复:将c = getchar();改为c = getch();。

  3. curses输入模式未正确配置
    如果主线程没有初始化curses的输入模式,特殊按键无法被识别,输入操作也会异常。需要在主线程的curses初始化代码中添加:

    initscr();          // 初始化curses屏幕
    cbreak();           // 禁用行缓冲,输入立即生效
    keypad(stdscr, TRUE); // 启用特殊按键(如KEY_UP/KEY_DOWN)的捕获
    noecho();           // 关闭输入字符回显,避免干扰游戏界面
    
  4. 线程安全问题
    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);
      
  5. 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:05:21