如何在不使用Sleep()的情况下输入文字,一次输出一个字母?
答案 0 :(得分:2)
睡眠是最佳选择,因为它不会浪费CPU周期。
另一种选择是忙着等待,这意味着你不断地旋转执行NoOps。你可以用任何完全没有任何东西的循环结构来做到这一点。我不确定这是为了什么,但似乎你可能也想让你在角色之间等待的时间随机化,以给它一种自然的感觉。
答案 1 :(得分:2)
我会有一个Tick()方法循环遍历字母,只有在随机数小于我设置的阈值时才会进展。
某些伪代码可能看起来像
int escapeIndex = 0;
int escapeMax = 1000000;
boolean exportCharacter = false;
int letterIndex = 0;
float someThresh = 0.000001;
String typedText = "somethingOrOther...";
int letterMax = typedText.length();
while (letterIndex < letterMax){
escapeIndex++;
if(random(1.0) < someThresh){
exportCharacter = true;
}
if(escapeIndex > escapeMax) {
exportCharacter = true;
}
if(exportCharacter) {
cout << typedText.charAt(letterIndex);
escapeIndex = 0;
exportCharacter = false;
letterIndex++;
}
}
如果我在视频游戏中这样做,可以说模拟玩家在终端中输入文字,我就是这样做的。它每次都会有所不同,它的逃逸机制为操作提供了最大时间限制。
答案 2 :(得分:0)
睡觉是做你所描述的最好的方式,因为替代方案,忙碌的等待,只会浪费CPU周期。从评论中,听起来你一直在尝试手动硬编码你想用睡眠呼叫打印的每一个字符,而不是使用循环......
由于在约20分钟后没有迹象表明这是作业,我想我会发布这段代码。它使用来自usleep
的{{1}},如果您使用的是Windows <unistd.h>
,则会睡眠X 微秒。
Sleep()
由于#include <stdio.h>
#include <unistd.h>
void type_text(char *s, unsigned ms_delay)
{
unsigned usecs = ms_delay * 1000; /* 1000 microseconds per ms */
for (; *s; s++) {
putchar(*s);
fflush(stdout); /* alternatively, do once: setbuf(stdout, NULL); */
usleep(usecs);
}
}
int main(void)
{
type_text("hello world\n", 100);
return 0;
}
被缓冲,因此您必须在打印每个字符(stdout
)后刷新它,或者通过运行{{1}将其设置为不缓冲输出一次。
以上代码将打印fflush(stdout)
,每个字符之间的延迟为100毫秒;非常基本的。