2010-09-27 32 views
10

Tôi có một chương trình ncurse nhỏ tôi đang chạy, nhưng đầu ra dường như không hiển thị trừ khi tôi dán wrefresh() trong một vòng lặp while.NCurses Refresh

Có một số bộ đệm đang diễn ra hay không? Tôi đã thử các chức năng khác của refresh trong thư viện và fflush với stddout (mà tôi không nghĩ là có ý nghĩa, nhưng đáng thử), nhưng không có gì có vẻ hiệu quả.

Câu hỏi nhỏ thứ hai: để thực hiện getch() không chặn, chúng tôi cần gọi nodelay(win,TRUE), phải không?

 

void main() 
{ 
     initscr(); 
     start_color(); 
     init_pair(1,COLOR_YELLOW,COLOR_CYAN); 
     WINDOW *win = newwin(10,10,1,1); 
     wbkgd(win,COLOR_PAIR(1)); 
     wprintw(win,"Hello, World."); 
     wrefresh(win); 
     getch(); 
     delwin(win); 
     endwin(); 
} 
 
+0

Tôi đã thêm mã sau: trong khi (ERR == getch()) { wrefresh (thắng); ++ ctr; } và đầu ra có vẻ tốt, nhưng tôi vẫn không hiểu tại sao ban đầu nó không hiển thị mà không lặp. – Tim

Trả lời

17

Bạn không được phép kết hợp các thao tác trên stdscr và các cửa sổ được tạo bằng newwin(). getch() hoạt động trên stdscr, do đó, đó là vấn đề của bạn. Thay thế mà cuộc gọi với

wgetch(win); 

(getch() đang gây ra stdscr được đổ trên đầu cửa sổ khác của bạn, và vì điều đó xảy ra quá nhanh có vẻ như các cửa sổ khác không bao giờ bị trưng bày tại tất cả).

+0

Đúng vậy. Cảm ơn nhiều! Xin lỗi, nhưng tôi cần phải hỏi thêm một lần nữa: khi bạn gọi một hàm hoạt động trên một cửa sổ, nó sẽ tập trung vào cửa sổ đó nếu có một thứ như tiêu điểm? – Tim

+0

@Tim: Con trỏ phần cứng được đặt ở vị trí con trỏ trong cửa sổ mà bạn đã làm mới lần cuối, nhưng đó thực sự là loại "tiêu điểm" duy nhất. – caf

+0

Nếu bạn cần cửa sổ xếp chồng độc lập, bạn nên xem thư viện bảng là một phần của ncurses. – Craig

2

Làm việc như được thiết kế. Điều đó cho phép bạn vẽ lại hoàn toàn màn hình tiếp theo của bạn nhưng chỉ những phần thực sự thay đổi được gửi đến thiết bị đầu cuối vào thời gian làm mới. Đây không phải là một vấn đề lớn trong những ngày này nhưng đã tạo ra sự khác biệt lớn khi kết nối thiết bị đầu cuối tương đối chậm.

+0

Cảm ơn bạn đã trả lời. Tôi hiểu đó là trường hợp, nhưng tôi không thấy gì ngoài một màn hình trống. Làm cách nào để cửa sổ và văn bản xuất hiện * ban đầu * mà không lặp lại gọi wrefresh()? – Tim

Các vấn đề liên quan