【问题标题】:"Press Any Key or Wait for 10 Seconds to Continue"“按任意键或等待 10 秒继续”
【发布时间】:2013-10-24 14:23:24
【问题描述】:

我这里有一个代码,它可能会在继续之前延迟 10 秒,但我想添加一个功能,用户可以等待该延迟或按任意键继续,我知道它不会像 @987654323 @有什么办法吗?

#include <stdio.h>
#include <conio.h>
#include <dos.h>

void main(){
    clrscr();
    printf("Press Any Key or Wait for 10 Seconds to Continue");
    delay(10000); 
    //getch();
}

【问题讨论】:

  • 你可以用线程很好地做到这一点。你对此了解很多吗?
  • 您可以获取一个时间戳并执行一个繁忙的等待循环,该循环在按下某个键或新的时间戳显示 10 秒过去时结束
  • 这个答案为 IX'ish(非 Windows)系统提供了一种方法:stackoverflow.com/a/18289845/694576 它采用相反的方法:进入阻塞读取并在一定时间后取消它。
  • @alk 先生,我只学习 C,正如我的标题中所说的那样,ruakh 已经编辑过,我也在我的编译器中尝试过你的代码,因为我还不知道 C++,所以我不知道是不是我的问题是从错误开始有很多错误 - 找不到 UNISTD.h 标头,显然我没有那个标头...

标签: c


【解决方案1】:

使用alarm其实很简单:

printf("Press Any Key or Wait for 10 Seconds to Continue");
alarm(10);
getch();
alarm(0);

您可能需要在 SIGALRM 上设置处理程序。

【讨论】:

  • 请参阅我对 OP 的评论,以获取使用此方法的完整示例的链接。
【解决方案2】:
#include <stdio.h>
#include <conio.h>
#include <dos.h>

void main()
{
    int wait = 10000;

    clrscr();
    printf("Press Any Key or Wait for 10 Seconds to Continue\n");

    while(!kbhit() && wait > 0)
    {
        delay(100);
        wait -= 100;
    }
}

【讨论】:

  • cboard.cprogramming.com/c-programming/63166-kbhit-linux.html 有一个用于 linix 的 _kbhit 的实现,如果你需要的话。
  • @alk 先生,“便携式”这个词对我来说是新的吗?如果我使用这个“不太便携”的代码有什么缺点?
  • @Daniel: "portable" 在此上下文中指的是源代码的"portability"。有关详细信息,您可能想在这里阅读:en.wikipedia.org/wiki/Software_portability 这里:kbhit() 函数不是标准的 C 函数,因此它很可能在每个 C 可用的系统上都不可用。因此,至少在不对代码进行修改的情况下,将这段代码从一个平台“移植”到另一个平台可能很难甚至是不可能的。所以代码不是(非常)“portable”。
  • @alk,谢谢,我早就知道了,也许这就是为什么许多语言都是基于 C 的...
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 2013-09-30
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2013-11-10
  • 2015-01-23
相关资源
最近更新 更多