qbasic如何在指定时间后退出循环



cls

进行

keyed$=inkey$

循环直到键入$<>"

打印"你好世界"

结束

因此,在这个程序中,正如你所看到的,直到按下语句"keyed$=inkey$"中的一个键,程序才会显示hello世界。所以我想要这样一个语句或程序,它将在一定的时间内退出循环。因此程序将等待4秒,如果用户在此之前按下该键,程序将转到下一行,即使用户不按下任何键,程序也将在4秒内移动到下一行。请帮帮我!!!

您可以使用SLEEP语句:

PRINT "Press a key within 4 seconds to win!"
' Wait 4 seconds or until a key is pressed.
SLEEP 4
' Collect the key pressed, if any.
keyed$ = INKEY$
IF keyed$ <> "" THEN
    PRINT "You WON by typing: "; keyed$
ELSE
    PRINT "You LOST!"
END IF

请注意,某些键(如箭头键)被视为"扩展"键。keyed$的第一个字符将等于CHR$(0),告诉您检测到扩展密钥,第二个字符将允许您确定它是哪个密钥。如果你需要处理这些"双字节代码",你可以在QB64 wiki上找到更多关于它们的信息。对于这样的键,上面的代码不会很好地工作,如下所示,当我按下向上箭头键(CHR$(0) + CHR$(&H48))时:

Press a key within 4 seconds to win!
You WON by typing:  H
                   ^note the extra space for CHR$(0)

编辑

你可以使用这个而不是循环来做你想做的事情:

' Wait 4 seconds for a key to be pressed.
SLEEP 4
' If a key was not pressed in 4 seconds, keyed$ = "".
keyed$ = INKEY$
IF keyed$ = "" THEN PRINT "Timeout (no key pressed)"
PRINT "the hello world"

换句话说,如果使用SLEEP语句并在之后立即使用INKEY$函数,则不需要循环来检测是否按下了某个键。

如果您仍然喜欢带循环的基于计时器的解决方案,那么您可以使用一些额外的变量、一个额外的循环条件和TIMER函数,该函数返回自午夜以来经过的秒数。下面的操作与上面的SLEEP方法相同:

maxWait = 4
startTime = TIMER
DO
    ' Detect a key press.
    keyed$ = INKEY$
    ' Fix the start time if the loop started before midnight
    ' and the current time is after midnight.
    IF startTime > TIMER THEN startTime = startTime - 86400
' Loop until a key is pressed or maxWait seconds have elapsed.
LOOP UNTIL keyed$ <> "" OR startTime + maxWait < TIMER
' If a key was not pressed in 4 seconds, keyed$ = "".
IF keyed$ = "" THEN PRINT "Timeout (no key pressed)"
PRINT "the hello world"

这种更复杂的选项的优点是,在等待按键时,您可以在循环中做其他事情。当然,还有一个小问题。如果你做得太多,按键会被延迟检测到,因为按键时INKEY$不会被正确调用。例如:

maxWait = 4
startTime = TIMER
DO
    ' Do some work.
    x = 0
    FOR i = 1 TO 1000000
        x = x + 1
    NEXT i
    ' Detect a key press and exit the loop if one is detected.
    keyed$ = INKEY$
    ' Fix the start time if the loop started before midnight
    ' and the current time is after midnight.
    IF startTime > TIMER THEN startTime = startTime - 86400
' Loop until a key is pressed or maxWait seconds have elapsed.
LOOP UNTIL keyed$ <> "" OR startTime + maxWait < TIMER

回避这个问题很难。一个选项是@MatthewWhited建议的ON TIMER(n),但您只能使用一个计时器事件。这意味着您需要它在maxWait秒后退出循环,而不是检测到按键,即使有工作正在进行。同时,您的按键仍然会明显晚于预期时间被检测到。QB64允许使用多个定时器,允许您同时处理这两个定时器。它还允许您以毫秒精度指定n,而QBasic则只允许最小1秒精度。有关QB64对ON TIMER(n)的改进的更多信息,请参阅QB64 Wiki上的ON TIMER(n)

由于我不知道你的使用情况,我不能根据你提供的代码推荐一个或另一个解决方案。

相关内容

  • 没有找到相关文章

最新更新