睡眠N秒并等待按键

时间:2014-08-04 11:20:26

标签: c linux nonblocking

我想在C中编写一个执行某些功能的程序然后睡几分钟。 在这个睡眠期间,我想做一些事情并在按下按键时退出。

int main()
{
    while(1)
    {
        /*body*/
        sleep(300);
    }
    /*some lines here*/
    return 0;
}

无论如何我可以在睡眠期间或任何时候使用非阻塞键监听器退出循环吗?

3 个答案:

答案 0 :(得分:1)

不要睡300秒,而是300 x 1秒,然后检查按键:

int main()
{
    while(1)
    {
        /*body*/
        for ( int i=0; i<300; i++ )
        {
            if (keypressed())
                doSomething();
        }
    }
    /*some lines here*/
    return 0;
}

编辑:为什么代码中的while (1)?你真的想要无休止地运行你的程序吗? (在这种情况下,/*some lines here*/没有意义。)

答案 1 :(得分:1)

有几种可能的解决方案:

  1. 使用定时选择

  2. 使用2个线程 - 一个等待输入,另一个休眠并进行操作

  3. 正如@Axel建议的那样,将大睡眠分成几个较小的睡眠。要获得小于1秒的间隔,您可以使用usleep()或nanosleep()

  4. 最简单的解决方案可能是3,但效率稍差,因为它使用轮询而不是事件驱动

答案 2 :(得分:0)

在这个睡眠期间,我想做一些事情并在按下按键时退出。 - 这不可能。

因为在睡眠期间,进程将进入暂停状态。一旦该过程暂停,您不能做任何事情,直到它再次醒来。在那个睡觉时间,如果你按下任何按键,你的过程也不会知道发生了什么?或者按下了什么键?因为您的流程已暂停。

在您的代码中为什么使用while(1)? -

while(1)
{
   /*body*/
   sleep(300);
}
/*some lines here*/ // Your program wont execute this part. Because you have while(1) before. It wont comes out of the loop.