繁体   English   中英

在cmd中暂停\\冻结和取消冻结

[英]pause in cmd \ Freeze and UnFreeze

我需要cmd中的命令,该命令的作用类似于暂停,但我可以编写代码以继续。 例如

system("pause");
some lines of code;` 

system("pause")在于,直到用户按下sth,“某些代码行”才起作用。 我想用一些命令继续执行cmd。

如果可以避免,请勿使用system() 它很粗糙,容易出错且不可移植。

C11引入了线程支持,包括thrd_sleep() 那应该是您的首选解决方案(如果编译器安装程序支持)。

如果您的编译器供应商支持C11,管不着他。 那个标准现在已经快四年了。

WinAPI定义了Sleep()函数:

VOID WINAPI Sleep(
  _In_  DWORD dwMilliseconds
);

此函数使线程放弃其剩余时间片,并在基于dwMilliseconds的值的间隔内变得无法运行。

#include <windows.h>

int main()
{
    Sleep( 5000 ); // pause execution for at least 5 seconds
    some_lines_of_code;
    return 0;
}

我想要一些可以运行代码但仅在我授予其权限时才更新cmd的代码。

如果我理解正确, 那么代码将产生您不希望在按下键之前显示的输出。 如果您不介意分页输出,则可以使用类似

        FILE *stream = popen("PAUSE<CON&&MORE", "w");

并让代码输出流(使用fprintf(stream, ...)等)。

我认为您正在寻找的是一种检查stdin包含准备读取的数据的方法。 您想使用一些非阻塞异步 I / O,以便您可以在可用时读取输入,并在此之前执行其他任务。

您不会在标准C中找到有关非阻塞/异步I / O的全部内容,但是在POSIX C中,您可以使用fcntlSTDIN_FILENO设置为非阻塞。 举例来说,这是一个程序,提示您按Enter键(如pause操作)和忙循环,从而让您的代码在等待按键(ahemm,byte,由于从技术上讲stdin文件 ):

#include <stdio.h>
#include <fcntl.h>
int main(void) {
    char c;
    puts("Press any key to continue...");
    fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK);
    while (read(STDIN_FILENO, 1, &c) != 1 && errno == EAGAIN) {
        /* code in here will execute repeatedly until a key is struck or a byte is sent */
        errno = 0;
    }
    if (errno) {
        /* code down here will execute when an input error occurs */
    }
    else {
        /* code down here will execute when that precious byte is finally sent */
    }
}

那是非阻塞的I / O。 其他选择包括使用异步I / O或额外的线程。 您可能应该为此任务特别使用非阻塞I / O或异步I / O(即epollkqueue ); 仅使用额外的线程来确定何时将字符发送到stdin可能太重了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM