[英]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中,您可以使用fcntl
将STDIN_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(即epoll
或kqueue
); 仅使用额外的线程来确定何时将字符发送到stdin
可能太重了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.