DOS下实现的通用延时函数DELAY2

博客介绍了在TC3编译环境下,因TC自带的DELAY性能随机器不同变化大,作者编写了一个类似VB中利用KENEL32.DLL API做循环原理的自定义Delay2函数,希望大家对该函数进行测试并给出意见。

和那个在VB中利用KENEL32.DLL  API来做循环的原理是一样的,

编译环境:TC3.

那个TC自己的DELAY在性能上会随着机器的不同而有较大的变化,

我这个函数应该会好些,希望大家测试一下,给点意见。

#include <time.h>
float const SecPerFrame=0.05;
void Delay2(double Times,float SecPerFrame){
int Running=1;
double Tmptime=(double)clock()/(double)CLOCKS_PER_SEC;
double caculate=0,delaying=SecPerFrame;
while(Running&&caculate<Times){
   if((Tmptime+delaying)<((double)clock()/(double)CLOCKS_PER_SEC))
   {Tmptime=(double)clock()/(double)CLOCKS_PER_SEC;
   caculate+=delaying;
  }
}
}

### C语言清屏函数实现方法 在C语言中,可以通过多种方式实现清屏功能。以下是几种常见的实现方法及其特点: #### 1. **使用 `system` 函数** 通过调用操作系统命令来实现清屏是最简单的方法之一。对于Linux/MacOS平台,可以使用 `system("clear")`;而对于Windows平台,则使用 `system("cls")`。 ```c #include <stdlib.h> void clear_screen() { #ifdef _WIN32 system("cls"); // Windows 平台 #else system("clear"); // Linux/MacOS 平台 #endif } ``` 这种方法的优点是简单易用,缺点是对操作系统的依赖性强[^1]。 --- #### 2. **基于 ANSI 转义序列** ANSI转义序列是一种通用的标准,可以在支持该标准的终端上执行各种控制操作,包括清屏。以下是一个示例代码: ```c #include <stdio.h> void clear_screen_ansi() { printf("\033[2J\033[H"); } int main() { clear_screen_ansi(); return 0; } ``` `\033[2J` 表示清除整个屏幕,而 `\033[H` 则将光标移至左上角位置。此方法适用于大多数现代终端,但在某些环境中可能无法正常工作[^4]。 --- #### 3. **手动逐行覆盖(艺术化清屏)** 如果希望实现更加复杂的清屏效果,比如带有动画或渐变的效果,可以采用逐行覆盖的方式。这种方式通常需要结合图形库或者自定义逻辑完成。以下是一个简单的例子: ```c #include <conio.h> #include <dos.h> // delay() void artistic_clear(int x1, int y1, int x2, int y2) { for (int i = y1; i <= y2; ++i) { for (int j = x1; j <= x2; ++j) { gotoxy(j, i); putchar(' '); } delay(50); // 添加延迟以形成视觉效果 } } // 辅助函数:设置光标位置 void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } ``` 注意:以上代码仅适用于Windows环境中的Turbo C或其他兼容编译器。它通过逐步替换屏幕上每个字符为空格的方式来实现清屏,并加入延时以呈现动态效果[^3]。 --- #### 4. **嵌入式环境下直接操作硬件** 在嵌入式系统中,由于缺乏高级别的抽象层(如标准输入/输出流),因此需要直接与底层设备交互才能完成清屏任务。例如,通过UART发送特定指令给显示器模块即可达成目标[^4]。 ```c void uart_send_char(char ch); void clear_screen_embedded() { const char *esc_seq = "\033[2J\033[H"; while (*esc_seq) { uart_send_char(*esc_seq++); } } ``` 这里的 `uart_send_char()` 是一个假定存在的低级通信接口函数,实际应用时需依据具体硬件设计相应的驱动程序。 --- ### 总结 每种方法都有其适用场景以及局限性: - 如果追求跨平台性和简洁度,推荐优先考虑 `system()` 或 ANSI 转义序列; - 若要求更高的灵活性和定制能力,则可以选择手工绘制型方案; - 对于资源受限的嵌入式项目来说,直接操控外设可能是唯一可行的选择。 无论选用哪种技术路线,请务必确认当前运行环境是否满足相应条件后再实施部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值