Ncurses:面板的doupdate()和refresh()之间的区别
doupdate()
和refresh()
什么区别?
似乎refresh ()
可以替换doupdate()
,但是除非调用refresh()
否则不会出现文本。
另外, refresh()
刷新所有窗口,还是应该为每个窗口调用refresh()
?
来自Dan Gookin的程序员NCurses指南 (第513页):
NCurses中的刷新操作由两部分组成:
- 首先,NCurses获取已经改变或触摸的那些窗口部分,并从窗口数据中写入这些部分
结构到内存中的虚拟屏幕。- 其次,在终端上显示自上次刷新以来触摸的虚拟屏幕的内容。
通过wnoutrefresh()函数执行从窗口数据结构到虚拟屏幕的信息复制。 将虚拟屏幕更新到终端由另一个函数doupdate()处理。 它们一起构成了refresh()或wrefresh()调用的两个组件。
更新多个窗口时使用wnoutrefresh()的优点。 在这种情况下,重复调用wnoutrefresh()后跟一个单独的doupdate()调用比一系列wrefresh()调用更有效,而且它会导致更少的闪烁。
就面板而言,它们是窗口的包装(因此每个面板只有一个窗口)。 调用update_panels()
(将窗口按照面板给出的正确堆叠顺序写入虚拟屏幕update_panels()
应该足够了,然后doupdate()
将输出虚拟屏幕输出到终端。
如果您想进一步划分面板,请考虑使用子窗口。