Linux 版 (精华区)
发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标 题: ◇ refresh , move 和 addch
发信站: 紫 丁 香 (Sun Nov 8 18:01:21 1998), 转信
寄信人: guest.bbs@hgluo.hust.edu.cn
标 题: ◇ refresh , move 和 addch
发信站: 华南理工大学 BBS木棉站
日 期: Thu Feb 20 14:15:48 1997
发信人: wdlin@CCCA.NCTU.edu.tw (Luke Lin), 信区: programming
标 题: Something about Curses
发信站: Computer Center, National Chiao-Tung Uni (Wed Jan 25 02:16:06 1995)
转信站: phoenix!bbsroute!news.csie.nctu!news.cc.nctu!debbie.cc.nctu!wdlin
◎ refresh ,move ,addch
------------
ccsun17 [HW/Curtest]% cat 1.c
#include <stdio.h>
#include <curses.h>
int main()
{
int line;
char c;
initscr();
refresh();
for(line=0;line<LINES;line++){
move(line,line);
c=line+'0';
addch(c);
}
refresh();
endwin();
}
ccsun17 [HW/Curtest]% cc 1.c -lcurses -ltermlib
ccsun17 [HW/Curtest]% a.out
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
Gccsun17 [HW/Curtest]%
------------
在这个程式中,我们可以看到三个新的函数,refresh ,move 以及
addch 。我们先来看看 refresh 的用法,不过为了要了解 refresh ,我
们可以再试试看下面这个两个相似的程式。
------------
ccsun17 [HW/Curtest]% cat 2f.c
#include <stdio.h>
#include <curses.h>
int main()
{
int line;
int i;
char c;
initscr();
refresh();
for(line=0;line<LINES;line++){
move(line,line);
c=line+'0';
addch(c);
for(i=0;i<50000;i++);
}
endwin();
refresh(); /* notice! refresh() is here! */
}
ccsun17 [HW/Curtest]% cat 2s.c
#include <stdio.h>
#include <curses.h>
int main()
{
int line;
int i;
char c;
initscr();
refresh();
for(line=0;line<LINES;line++){
move(line,line);
c=line+'0';
addch(c);
for(i=0;i<50000;i++);
refresh(); /* refresh() is moved to here!! */
}
endwin();
}
ccsun17 [HW/Curtest]%
------------
为了要了解 refresh 的功用,我们一定要仔细的比较这两个程式的差
别在哪。我们可以发现这两个程式的差别就在 refresh 的位置不同,在 2f.c
中,refresh 的位置在回圈外面,而 2s.c 中的 refresh 在回圈的里面。
在执行时我们可以清楚的看出 2f.c 的输出是 "一起" 出现的,而 2s.c
的输出是 "一个一个" 的,我们一定要注意到这个状况,因为这是由 refresh
位置不同而改变的。
现在,我们可以来看看 refresh 的功用是甚麽了。refresh 的功用主
要是把输出的资料对映到萤幕上。也许有人会奇怪,我们输出的资料不都
会直接出现在萤幕上吗? 事实上对 curses 来讲是有些不一样的,因为它
为了机器处理资料以及显示的效益,它有一块记忆体专门把输入的资料储
存起来,然後在我们使用 refresh 时将它所对映的字元放在萤幕上。所以
在我们使用 refresh 时要好好的考虑它的位置,这样才可以使我们的程式
更有效率。
我们可以看看 2f.c 和 2s.c 这两个程式的差别,在 2f.c 中,我们
可以看到refresh 是在回圈之外的,所以程式在执行的时後会把资料都先
放到记忆体中,然後呼叫 refresh 时才会把它们对映到萤幕上。所以我们
看到的输出是 "一起" 出现的。
而 2s.c 中的refresh 是在回圈之中的,所以每当我们放入资料後,
程式便要把资料对映到萤幕上一次,所以我们看到的资料就是 "一个一个"
出现的。
所以我们可以了解到 2f.c 所用的时间会比 2s.c 少,因为 2s.c 中
共执行 refresh LINES 次,而 2f.c 中只执行refresh 一次。如果这个回
圈的执行次数很大的话,我们就可以想像到 2s.c 的执行时间会远比 2f.c
多出许多。这样,我们就可以了解到 refresh 位置对程式效率的重要性了
。
此外,在这两个程式中,我们还可以看到有一行
"for(i=0;i<50000;i++);"
,这是为了让大家能看出 2s.c 中的程式是 "一个一个" 出来的。如果我
们把 50000 换成一个更大的数字,就更能看出 2s.c 的资料确是 "一个一
个" 出来的。
讲完了 refresh ,我们就可以再来看看另外两个函数 move 和 addch
。move 的参数有两个,分别是所要移到的列数以及行数,也就是这样:
move(int y,int x);
(0,0) x (0,COLS-1)
┌————————┐
│ | │
│ | │
y│------_要移到这 │
│ │
│ 这是萤幕 │
└————————┘
(LINES-1,0) (LINES-1,COLS-1)
而且 -1<y<LINES -1<x<COLS ,x 和 y 皆为整数。要注意到,第一个
参数是 y 不是 x ,这和 pc 上某些 c 的函数是不太相同的。
接下来是 addch ,这个函数是用来在游标所在位置放入指定的字元。
但我们要注意到,它是将资料放在游标所在的位置的资料区,并非在萤幕
上放字元。更有某些版本 (事实上是大多数的) 的 curses 的游标位置也
不是我们在萤幕上所看到的位置,因为游标的位置也被 curses 记下来了
。所以在我们始用 move 和 addch 时也要注意配合 refresh 的使用。
--
Luke Lin. 林文□
e-mail address:wdlin@CCCA.NCTU.edu.tw u8222002@cc.nctu.edu.tw
--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--
Enjoy Linux!
-----It's FREE!-----
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.643毫秒