2010-09-27 5 views
10

Çalıştığım küçük bir ncurse programım var, ancak bir süre döngüsünde wrefresh()'u yapıştırmadığım sürece çıktı görünmüyor.NCurses Yenile

Bazı arabelleğe girme falan var mı? Kitaplıktaki diğer refresh işlevlerini ve stddout ile fflush'u denedim (bunun mantıklı olduğunu düşünmüyorum, ama denemeye değer), ancak hiçbir şey işe yaramıyor gibi görünüyor.

İkinci bir küçük soru: getch() engellemeyi engellemek için nodelay(win,TRUE) numaralı telefonu aramamız gerekiyor, değil mi?

 

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

Aşağıdaki kodu ekledim: (ERR == getch()) { wrefresh (win); ++ ctr; } ve çıktı iyi görünüyor, ancak hala neden döngü olmadan görüntülemediğini anlamıyorum. – Tim

cevap

17

stdscr'daki işlemleri ve newwin() ile oluşturulan pencereleri karıştırmamanız gerekir. getch(), stdscr üzerinde çalışır, bu sizin probleminizdir. (getch()stdscr diğer pencerenin üstünden atılmış olması neden oluyor ve o kadar hızlı olur çünkü asla hiç görüntülenen var diğer pencereye benziyor)

wgetch(win); 

ile o aramayı değiştirin.

+0

Doğru sensin. Çok teşekkürler! Özür dilerim, ama bir tane daha sormam gerekiyor: Bir pencerede çalışan bir işlevi çağırdığınızda, odak olarak böyle bir şey varsa o pencereye odağı ayarlar mı? – Tim

+0

@Tim: Donanım imleci en son yenilenen pencerede imlecin bulunduğu yerde kalır, ancak bu gerçekten tek odak noktasıdır. – caf

+0

Bağımsız üst üste binme pencerelerine ihtiyacınız varsa, ncurses'ın bir parçası olan panel kitaplığına bakmalısınız. – Craig

2

Bu, tasarlandığı şekilde çalışmaktadır. Bu, bir sonraki ekranınızı tamamen yeniden çizmenizi sağlar, ancak yalnızca değiştirilen parçalar yenileme zamanında terminale gönderilir. Bu günlerde çok da önemli değil ama terminal bağlantıları nispeten yavaş olduğu zaman büyük bir fark yarattı.

+0

Cevabınız için teşekkürler. Anladığım kadarıyla, ama boş bir ekran göremiyorum. Pencereyi ve metni görünecek şekilde * nasıl * * tekrar tekrar wrefresh() çağırmadan * nasıl alabilirim? – Tim