| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1539 人关注过本帖
标题:求助:C中关于时间中断的问题
只看楼主 加入收藏
qantas_18
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2004-11-27
收藏
 问题点数:0 回复次数:14 
求助:C中关于时间中断的问题

大家好:本人是个初学编程的菜鸟,最近想编个俄罗斯方块的游戏,但是不知道时间中断改如何定义,我原先用delay()函数,但是速度太快了,10000毫秒也快的惊人,请教一个各位大虾改如何实现这个问题!

搜索更多相关主题的帖子: 俄罗斯方块 大虾 定义 时间 
2004-12-12 15:26
amoeba
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2004-8-9
收藏
得分:0 
sleep(1);

2004-12-12 16:31
qantas_18
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2004-11-27
收藏
得分:0 

这个还可以的,但是为什么delay()不行呢,按道理delay(1000)和sleep(1)是一样的,但是为什么delay(1000)就和没有delay一样呢,我用的是TC2。还请多多指教!

2004-12-12 22:13
时空之蕊
Rank: 2
等 级:新手上路
威 望:3
帖 子:691
专家分:0
注 册:2004-10-31
收藏
得分:0 

是不是发生了溢出!

或者由于你的cpu速度用GHz来计算,而delay在以前确是用cpu来控制的,以前的cpu很慢的!!


我渴望掌控时空的核心——用最先进的技术,打造无比美丽的世界!
2004-12-13 02:16
qantas_18
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2004-11-27
收藏
得分:0 

现在谁的CPU不是用GHZ来计算的啊。那个我不是很清楚啊

2004-12-14 06:31
迷失星际
Rank: 1
等 级:新手上路
帖 子:358
专家分:0
注 册:2004-7-9
收藏
得分:0 
编号了传上来玩玩啊

2004-12-14 17:07
心若在
Rank: 1
等 级:新手上路
帖 子:82
专家分:0
注 册:2004-9-21
收藏
得分:0 

/*时间中断定义*/ # define TIMER 0x1c

int t=0;

void interrupt(*oldhandler)();

void interrupt newhandler() /*定义新的时间中断处理函数*/

{ t++;

oldhandler();

}

/*设置时间中断*/ void SetTimer(void interrupt(*IntProc)())

{ oldhandler=getvect(TIMER); /*保存原中断调用函数*/

disable(); /*禁止*/

setvect(TIMER,IntProc); /*设置新的时间中断处理函数*/

enable(); /*开启*/

}

/*时间中断结束*/ void KillTimer() { disable(); /*禁止中断*/

setvect(TIMER,oldhandler); /*还原时间中断*/

enable(); /*允许中断*/

}

有点难理解 我再转贴篇文章

为了能够计算打字的时间并同时在屏幕上显示出来,比较好的办法就是修改中断服务程序。 在BIOS(基本输入输出系统)中的第0x1c号中断是一个时钟中断,它每秒钟产生18.2次的中断。该中断实际上不起什么作用,它是一个只有一条中断返回语句的空中断。在程序执行中,将第0x1c号中断的地址向量指向另外编写的一个中断处理程序(函数): void far interrupt handler(void)。 方法是:setvect(0x1c,handler)。 在修改0x1c的中断向量之前,还必须将原来的中断向量保存起来。以便在程序结束时恢复原来的中断向量,否则即使程序运行结束了计时也不会停下来。因此程序中设置了一个函数指针用来保存原来的中断向量: interrupt far (*oldhandler)(void)。 使用语句oldhandler=getvect(0x1c)把原来的中断向量保存在oldhandler中。要恢复原来的中断向量,用setvect(0x1c,oldhandler)即可完成,同时也起到停止计时的作用。 在下面的中断处理程序中,sj是时钟中断累加器,每产生一次时钟中断,sj便加1,当达到18次时,表示时间经过了1秒钟,则秒数增加1。实际上因为BIOS每秒钟产生18.2次的中断,5秒钟便产生91次中断,而前面的方法5秒钟产生90次中断,显然这种方法有误差,因此程序中设置了一个计数器count,当count达到5时让sj累加19次才进1秒。 void far interrupt handler(void) {char sec[3]="0",min[3]="0",temp[3]; sj++; /*时钟中断次数累加器加1*/ if (sj>=18) /*时钟中断次数达到18次,即时间经过了1秒钟*/ {count++; /*计数器加1*/ Second++; /*秒数增加1秒*/ if (Second>=60) /*若秒数达到60,则秒复位为0,而分增加1*/ {Second=0; Minute++; } if (Minute<10) {itoa(Minute,temp,10); strcat(min,temp);} else itoa(Minute,min,10); if (Second<10) {itoa(Second,temp,10); s trcat(sec,temp);} else itoa(Second,sec,10); WriteString(24,72,0x70,min,2); /*在第24行72列显示分钟 */ WriteString(24,74,0x70,":",1); WriteString(24,75,0x70,sec,2); /*显示秒钟 */ if (count==5) /*若计数器达到5,让sj延长1次中断*/ {count=0;sj=-1;} else sj=0; } }

[此贴子已经被作者于2004-12-15 22:46:06编辑过]


我知道我菜 但我会尽我最大的努力去帮助别人!
2004-12-15 22:21
qantas_18
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2004-11-27
收藏
得分:0 

太感谢你了,不过我还是不太懂!呵呵~

2004-12-18 15:03
Juhnpen
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2004-12-20
收藏
得分:0 
看来我的好好学学了,你的程序我竟然看不懂。郁闷!

是自己的,就要去争取;不属于自己的,就不要强求。
2004-12-20 11:14
sjyf
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2005-10-18
收藏
得分:0 

我最近也遇到了这个问题,我最先用的是空循环来实现时间延迟,但是觉得这样不好,所以就该成用sleep(int ),我又决得这个时间单位太大(是秒级的),delay()的易值性应该是很差的,它延迟的时间与cpu有关系.所以我现在用的仍然是空循环实现的延迟.

2006-05-28 14:36
快速回复:求助:C中关于时间中断的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019424 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved