You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python定时器实现快速时间事件时,替换超时触发函数遇阻求助

解决QTE超时替换自定义函数的问题

问题根源

  1. 原代码中input()会阻塞主线程,超时后Timer线程执行自定义函数时,主线程仍卡在输入等待,导致流程无法推进
  2. 自定义函数若涉及终端交互,会和主线程的input()输出冲突,引发显示混乱
  3. 原代码缺少对random模块的导入,会直接触发运行错误

修正方案

以下是调整后的代码,解决了线程阻塞、函数触发异常的问题:

import time
import random
import sys
from threading import Timer

# 确保menu模块已正确导入,例如:import menu

def timeout_handler():
    print("\nYou timed out!")
    # 执行自定义跳转函数
    menu.hall()
    # 关闭标准输入,终止主线程的input阻塞
    sys.stdin.close()

# 随机延迟触发QTE
time.sleep(random.randint(1,5))
timeout = 5

# 创建Timer,绑定自定义超时处理逻辑
timer = Timer(timeout, timeout_handler)
timer.start()

start_time = time.time()
prompt = f"You have {timeout} seconds to dodge, press enter...\n"

try:
    answer = input(prompt)
    # 用户输入成功,取消定时器
    timer.cancel()
    end_time = time.time()
    reaction_time = end_time - start_time
    
    if reaction_time < timeout:
        print(f"You dodged in {reaction_time:.2f}! ")
        time.sleep(3)
        menu.startp()
except EOFError:
    # 捕获输入关闭的异常,对应超时场景的主线程收尾
    pass

关键调整说明

  • 超时处理函数:新增timeout_handler(),执行自定义函数后关闭标准输入,强制终止主线程的input()阻塞,让QTE流程正常结束
  • 异常捕获:捕获EOFError(输入关闭时触发),处理超时后的主线程收尾逻辑
  • 线程协调:避免多线程同时操作终端导致的输出混乱,通过关闭输入让主线程退出阻塞状态
  • 补全依赖:添加了缺失的random模块导入,修复原代码的运行错误

内容的提问来源于stack exchange,提问作者Mareks Zuks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:25:20