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

Python+PsychoPy+Windows环境下运行代码中断后返回原执行点的实现问题

Python PsychoPy场景下类中断需求实现方案

Python本身没有微控制器级别的硬中断能力,但针对你描述的PsychoPy开发场景,有两种完全符合需求的优雅实现方案,无需在主代码中频繁插入事件检查逻辑,也不需要多任务并行。

方案1:Timer+线程锁实现(推荐,无主代码侵入)

  • 核心逻辑:用threading.Timer做后台计时,到点后通过线程锁抢占主线程执行基线任务,执行完成后自动释放锁,主线程从断点处恢复运行,和中断效果完全一致
  • 配套全局按键监听用守护线程实现,按下指定键立即终止程序
from psychopy import core, event, visual
import threading
import random

# 初始化基础环境
win = visual.Window(size=(800,600))
exit_key = 'escape' # 自定义全局终止按键
baseline_lock = threading.Lock()

# 定义基线任务逻辑
def run_baseline_task():
    with baseline_lock: # 加锁后主线程自动挂起,等待基线任务执行完成
        # 此处替换为你的实际基线任务代码
        tip = visual.TextStim(win, text="请完成当前基线任务")
        tip.draw()
        win.flip()
        core.wait(random.uniform(6,9)) # 模拟任务实际耗时
    # 基线任务结束后重置下一次触发定时器
    next_interval = random.uniform(60,90)
    threading.Timer(next_interval, run_baseline_task).start()

# 定义全局终止按键监听
def listen_exit_key():
    while True:
        if event.getKeys(keyList=[exit_key]):
            core.quit()
        core.wait(0.1) # 降低监听线程CPU开销

# 启动后台服务
threading.Thread(target=listen_exit_key, daemon=True).start()
first_interval = random.uniform(60,90)
threading.Timer(first_interval, run_baseline_task).start()

# 此处编写你的主程序逻辑即可,不需要插入任何检查代码
# 示例主程序逻辑
for i in range(3600):
    stim = visual.TextStim(win, text=f"主程序运行中:第{i}帧")
    stim.draw()
    win.flip()
    core.wait(1)

方案2:帧回调检查实现(无多线程,兼容性更强)

  • 核心逻辑:利用PsychoPy本身的帧循环机制,每帧刷新前仅执行一次时间检查和按键检查,总开销<1ms,完全不会影响主程序运行
  • 仅需在主循环开头统一加两处检查,不需要在主业务逻辑中零散插入校验代码
from psychopy import core, event, visual
import random

win = visual.Window(size=(800,600))
exit_key = 'escape'
clock = core.Clock()
next_baseline_time = random.uniform(60,90)

# 定义基线任务
def run_baseline_task():
    # 此处替换为你的实际基线任务代码
    tip = visual.TextStim(win, text="请完成当前基线任务")
    tip.draw()
    win.flip()
    core.wait(random.uniform(6,9))
    return random.uniform(60,90) # 返回下一次触发的时间间隔

# 主程序帧循环
while True:
    # 帧开头统一做两项检查,无业务侵入性
    if event.getKeys(keyList=[exit_key]):
        core.quit()
    if clock.getTime() >= next_baseline_time:
        next_baseline_time = clock.getTime() + run_baseline_task()
    
    # 此处编写你的主程序逻辑即可
    stim = visual.TextStim(win, text="主程序运行中")
    stim.draw()
    win.flip()

注意事项

  • 基线任务执行时如果需要修改主程序正在使用的变量,建议先做临时备份,任务执行完成后再恢复,避免主流程运行异常
  • 两种方案均兼容PsychoPy v2021.2.3版本,Windows 10系统下运行稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:12:01