CLS
DO
键控$ = INKEY $
循环直到键入$<>""
打印" hello world"
端
所以在这个程序中你已经看到直到按下语句中的一个键"键入$ = inkey $"该程序不会显示你好的世界。所以我想要一个在一定时间内退出循环的语句或程序。因此程序将等待4秒钟,如果用户按下之前的键,它将进入下一行,即使用户不按任何键,程序也将在4秒内移至下一行。请帮帮我!!!
答案 0 :(得分:2)
您可以使用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)
,告诉您已检测到扩展密钥,第二个字符将允许您确定它是哪个密钥。如果需要处理它们,可以find more information on the 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
避免这个问题很棘手。一个选项是ON TIMER(n)
as suggested by @MatthewWhited,但您只能使用一个计时器事件。这意味着你需要它在maxWait
秒之后退出循环而不是检测按键,即使有工作正在进行。与此同时,您的按键仍然会比预期的要晚得多。 QB64允许使用多个计时器,允许您同时处理这两个计时器。它还允许您指定具有毫秒精度的n
,这与QBasic不同,QBasic仅允许最小1秒的精度。有关QB64对ON TIMER(n)
的改进的详细信息,请参阅ON TIMER(n)
on the QB64 Wiki。
由于我不知道您的使用案例,因此我不能根据您提供的代码推荐一种或另一种解决方案。