PsychoPy:通过子进程显示主进程和时间

时间:2015-11-18 13:31:53

标签: psychopy

我使用的是由该实验室的前博士学生完成的心理代码。该代码旨在显示刺激(随机点运动图)并使用子过程进行精确定时。

使用以下行创建子流程:

process = subprocess.Popen(['python', 'LPTmat.py'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

然后当显示第一帧时,代码会写一个数字来告诉子进程开始计时:

if first_frame == True:
        process.stdin.write('%i\n'%1) #start timer and check of the PP
        first_frame = False

Subprocess然后启动计时器并记录按下的按钮(并行端口):

while True:
input = sys.stdin.readline()
if input == '1\n':
    timer.reset()
    parallel_port_state = ctypes.windll.inpout32.Inp32(lptno)       
    while parallel_port_state == etat_repos:
        parallel_port_state = ctypes.windll.inpout32.Inp32(lptno)                  
        lecture_time = timer.getTime()
    if  parallel_port_state in port_gauche:
        send_trigger (1)
    elif  parallel_port_state in port_droit:
        send_trigger (2)
    np.savetxt('mat.txt',mat)#a button has been pressed   

主要过程比检测txt文件并停止刺激呈现:

    mtext= os.path.exists('mat.txt')
    if mtext== True:#if the mat.txt file exists, a button has been pressed 
        myWin.flip()#black screen
        process.stdin.write('%i\n'%3)
        check = process.stdout.readline()#read which button has been pressed
        check = int(check)

然后通过子进程检查响应时间记录器并删除创建的txt文件:

process.stdin.write('%i\n'%2)
RT = process.stdout.readline()
RT = float (RT)
rep.rt = RT
os.remove('mat.txt')

问题是创建的.txt文件实际上并不是一种干净的方式来完成这项工作所以我想知道它们是否是使用这个子流程的另一种方式,并告诉主流程是否有响应?

干杯, 加布里埃尔

1 个答案:

答案 0 :(得分:1)

异步设备轮询是导致ioHub发展的主要原因之一,GIL已于去年左右合并为PsychoPy。从本质上讲,ioHub创建了一个新的Python进程,与您的外部设备接口,而主要的PsychoPy进程可以继续提供刺激,不受设备轮询的干扰。在任何所需的时间,例如在刺激生成和呈现的时间关键阶段过去之后,PsychoPy过程可以从ioHub过程请求收集的数据。

(请注意,由于LabJack,CPython中的普通Python 线程永远不会同时执行 ;这就是为什么ioHub会创建一个全新的进程,不仅仅是另一个线程。)

ioHub已经支持许多不同类型的硬件和接口(串口,眼动仪,不同类型的响应按钮盒等)。不幸的是,据我所知,迄今为止还没有集成并行端口支持。

但不要绝望!我看到 已经支持ready-to-use interface设备,它已经取代了许多心理物理学和电生理学实验室中稳定消失的并行端口。这些设备相对便宜(约300美元),可通过USB端口连接到现代计算机。 ioHub有一个this demo用于LabJacks,也在{{3}}中进行了演示。

另一种选择当然是为ioHub开发自己的并行端口接口。但鉴于此界面的流行度,可用性和适用性逐渐消失,我想知道这是否真的值得付出努力。