免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6374 | 回复: 10
打印 上一主题 下一主题

[C] ncurses编程,屏幕刷新问题 [复制链接]

求职 : c/c++研发
论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-05 10:44 |只看该作者 |倒序浏览
最近学习ncurses字符界面编程,显示的数据是实时数据,需要一秒刷新一次具体的数据值,我目前的方式是先清除屏幕上的字符,先后在重新画一遍。但是效果看起来很不好,屏幕感觉一直在闪烁。有没有高手告诉下我到底应该如何正确的刷新

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2014-06-05 16:23 |只看该作者
本帖最后由 yulihua49 于 2014-06-05 16:25 编辑
bigxhome 发表于 2014-06-05 10:44
最近学习ncurses字符界面编程,显示的数据是实时数据,需要一秒刷新一次具体的数据值,我目前的方式是先清除 ...

不要清屏,也不要重画,只需修改某些内容(stdwin,newwin,or subwin。。。千万不要动curwin),然后refresh。。。。。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
3 [报告]
发表于 2014-06-05 17:08 |只看该作者
本帖最后由 cokeboL 于 2014-06-05 17:08 编辑

只更改改动的部分。

建议封装个刷新函数+一个打印函数

再加两个缓冲,一个存放当前屏幕值,一个存放之前屏幕值

打印函数把屏幕修改的地方写到当前屏幕的缓冲区,刷新函数里对比当前屏幕值和之前屏幕值是否一样,只把不一样的地方调用接口修改,改完了把之前屏幕赋值为当前屏幕值

求职 : c/c++研发
论坛徽章:
0
4 [报告]
发表于 2014-06-05 18:12 |只看该作者
回复 2# yulihua49
没看太明白,不改curwin怎么刷新啊


   

求职 : c/c++研发
论坛徽章:
0
5 [报告]
发表于 2014-06-05 18:52 |只看该作者
回复 3# cokeboL
按照你所说的,要把屏幕上的一行分成多个数据域,然后将新旧屏幕的每一行的各个域都对比一下,将不同的行的不同域进行打印。在封装一个函数,实现打印指定行的指定域,是这个意思吧。
看来我现在的数据结构要进行大的调整,现在写的太简单了



   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2014-06-05 20:08 |只看该作者
本帖最后由 yulihua49 于 2014-06-05 20:26 编辑
bigxhome 发表于 2014-06-05 18:12
回复 2# yulihua49
没看太明白,不改curwin怎么刷新啊

curwin不是给你用的,它记录了屏幕的映像。当刷新的时候,你的win与curwin进行对比,输出不同的部分,就避免了整体刷屏。
3楼说的功能,系统早已实现了。你用的不对。curwin就是那个‘底版’,由系统管理,你千万别动。你只能refresh你自己的win。
你不能使用stdio的功能了,只能用printw,wprintw.....然后refresh,wrefresh。。。。
stdio会使实际屏与curwin不符,导致系统管理混乱。
屏幕定位使用move,wmove。不带前w的函数对应stdwin,否则针对特定的win。
3楼说的那组函数,就是wprintw,wscanw,inch,getch.........  还有echo,noecho等控制函数。特别是getch,可以识别箭头键和功能键,KEY_RIGHT,KEY_LEFT,KEY_UP,KEY_DOWN,KEY_F1....功能够强大吧?
属性设置可以产生彩色,反显,下划线,闪烁等效果。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
7 [报告]
发表于 2014-06-05 20:43 |只看该作者
按楼上说的搞,我说的是以前自家项目的LCD屏,ncurses没用到过

求职 : c/c++研发
论坛徽章:
0
8 [报告]
发表于 2014-06-06 09:26 |只看该作者
回复 6# yulihua49
我现在没有用stdio的东西,用的都是w*的那组API,看来重点还是如何判断出curwin和mywin的区别,然后再刷新不同的地方。

   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
9 [报告]
发表于 2014-06-06 13:37 |只看该作者
本帖最后由 yulihua49 于 2014-06-06 13:42 编辑
bigxhome 发表于 2014-06-06 09:26
回复 6# yulihua49
我现在没有用stdio的东西,用的都是w*的那组API,看来重点还是如何判断出curwin和mywi ...

不用你判断,系统自动的,wrefresh干的就是这个,你试试不就行了?
wrefresh的工作:对比你的win和curwin,输出差别的部分,将curwin修改过来。
你只需要修改你的win,wrefresh,完了,就这么简单。
其他都是画蛇添足。

求职 : c/c++研发
论坛徽章:
0
10 [报告]
发表于 2014-06-06 13:52 |只看该作者
回复 9# yulihua49
好像是搞明白了一点,我一会就去试下。还有一点暂时没搞明白,wrefresh(mywin),这个跟curwin有啥关系


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP