当前位置: 首页 > 面试题库 >

超时功能

程鸿畅
2023-03-14
问题内容

我想编写一个代码,要求输入用户名,但时间限制为15秒。如果用户超过限制并且未能输入名称(或任何字符串),则代码将终止,并且将显示“超时”消息,否则应保存名称并显示“谢谢”消息。我曾经尝试过这种方法,但是这是错误的&无法正常工作。请给我一个解决方案。。谢谢。

#include <stdio.h>
#include <time.h>

int timeout ( int seconds )
{
    clock_t endwait;
    endwait = clock () + seconds * CLOCKS_PER_SEC ;
    while (clock() < endwait) {}

    return  1;
}

int main ()
{
    char name[20];
    printf("Enter Username: (in 15 seconds)\n");
    printf("Time start now!!!\n");

    scanf("%s",name);
    if( timeout(5) == 1 ){
        printf("Time Out\n");
        return 0;
    }

    printf("Thnaks\n");
    return 0;
}

问题答案:

该虚拟程序可能会帮助您:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>

#define WAIT 3

int main ()
{
    char            name[20] = {0}; // in case of single character input
    fd_set          input_set;
    struct timeval  timeout;
    int             ready_for_reading = 0;
    int             read_bytes = 0;

    /* Empty the FD Set */
    FD_ZERO(&input_set );
    /* Listen to the input descriptor */
    FD_SET(0, &input_set);

    /* Waiting for some seconds */
    timeout.tv_sec = WAIT;    // WAIT seconds
    timeout.tv_usec = 0;    // 0 milliseconds

    /* Invitation for the user to write something */
    printf("Enter Username: (in %d seconds)\n", WAIT);
    printf("Time start now!!!\n");

    /* Listening for input stream for any activity */
    ready_for_reading = select(1, &input_set, NULL, NULL, &timeout);
    /* Here, first parameter is number of FDs in the set, 
     * second is our FD set for reading,
     * third is the FD set in which any write activity needs to updated,
     * which is not required in this case. 
     * Fourth is timeout
     */

    if (ready_for_reading == -1) {
        /* Some error has occured in input */
        printf("Unable to read your input\n");
        return -1;
    }

    if (ready_for_reading) {
        read_bytes = read(0, name, 19);
        if(name[read_bytes-1]=='\n'){
        --read_bytes;
        name[read_bytes]='\0';
        }
        if(read_bytes==0){
            printf("You just hit enter\n");
        } else {
            printf("Read, %d bytes from input : %s \n", read_bytes, name);
        }
    } else {
        printf(" %d Seconds are over - no data input \n", WAIT);
    }

    return 0;
}

更新:
这是经过测试的代码。

另外,我从man那里得到了一些提示select。本手册已包含一个代码段,该代码段可用于从终端读取内容,并且在无活动的情况下会在5秒内超时。

如果代码编写得不够好,请做一个简短的解释:

  1. 我们将输入流(fd = 1)添加到FD集。
  2. 我们发起select呼叫以侦听为任何活动创建的此FD集。
  3. 如果在此timeout期间内发生任何活动,则通过read调用读取该活动。
  4. 如果没有活动,则会发生超时。

希望这可以帮助。



 类似资料:
  • 问题内容: 我正在尝试为特定功能实现超时。我检查了SE中的许多问题,找不到适合我问题的解决方案,因为: 我在Windows中运行python 超时是在我无法控制的python函数上应用的,即它是在已经设计好的模块中定义的。 python函数不是子进程 我已经为特定任务开发了一个已经设计好的定制模块(例如),并且其中定义了功能。其中一个功能(例如)由于外部因素而倾向于永久运行,而我只是不希望pyth

  • 问题内容: 我正在尝试在angularJS中实现一个简单的计时器。但是,尽管每个人都建议超时功能不起作用。 当我注释掉“ $ timeout(countUp,500);”时 行,代码可以正常工作,但计时器不起作用。我还需要添加其他JavaScript文件吗? 提前致谢。 问题答案: 您必须将服务注入控制器

  • 问题内容: 我正在使用Android上的Firebase Cloud Functions库,并用于调用云函数。 问题在于该函数需要10到15秒的时间才能将结果返回给客户端,因此客户端会抛出异常。 码 如何更改超时,以便客户端在引发异常之前会等待更多时间? 注意。 我没有使用OkHttp,Retrofit或默认的系统网络功能,而是在使用Firebase Cloud Functions库()来调用该函

  • 我在Android上使用Firebase Cloud Functions library,并使用调用云函数。 问题是函数需要10-15秒将结果返回给客户端,因此客户端抛出异常。 注意。我没有使用OkHttp、REVERFIT或默认的系统网络函数,而是使用Firebase Cloud functions library()调用该函数。

  • 问题内容: 我正在尝试使用current.futures模块使超时在python3.2中工作。但是,当它超时时,并不会真正停止执行。我尝试了使用线程和进程池执行器,但它们都没有停止任务,只有直到完成后,超时才会增加。那么,有谁知道是否有可能使它起作用? 问题答案: 据我所知,TimeoutError实际上是在您期望的时间引发的,而不是在任务完成之后引发的。 但是,您的程序本身将继续运行,直到完成所

  • 问题内容: 我有一个脚本,该脚本遍历包含要访问的URL:s并截取其屏幕截图的文本文件。 所有这一切都完成且简单。该脚本会初始化一个类,该类在运行时会创建列表中每个站点的屏幕快照。某些站点的加载时间非常非常长,而某些站点可能根本无法加载。因此,我想将函数包装在一个超时脚本中,以使该函数在10秒内无法完成时返回。 我对最简单的解决方案感到满意,也许设置一个异步计时器,无论函数内部实际发生什么,该计时器