¿Cómo puedo paralelizar entrada y visualización en MATLAB?
-
08-10-2019 - |
Pregunta
Estoy usando Psychtoolbox en MATLAB para ejecutar un paradigma de la psicología del comportamiento. Como parte del paradigma, los usuarios tienen que ver un estímulo visual y responder a él utilizando algún mecanismo de entrada. Para un teclado, esto funciona de la siguiente manera:
- Mostrar estímulo
- Teclado de sondeo para la respuesta
- si no hay respuesta detecta, de nuevo bucle para 1
- Si la respuesta detectada, ruptura y seguir adelante con la escritura
Esta bien que funciona para un teclado, que en el paso 2 tarda entre 1-2 ms. El problema viene cuando uso un mecanismo de entrada alternativo; en ese caso, el paso 2 toma ~ 20 ms. (Necesito esta entrada alternativo para ejecutar el estudio, y que deben ser considerados hecho inmutable.) A medida que el estímulo cambia con un lapso de tiempo muy corto, esto sumado rompe la tarea de retardo.
Mi pensamiento actual es tratar de usar el procesamiento en paralelo, espectáculos de tal manera que un hilo del estímulo, y otro hilo sondea el teclado. Actualmente estoy usando el Parallel Computing Toolbox para hacer esto. El problema que estoy teniendo es que no sé cómo dirigir la entrada de teclado a un hilo "parallelized". ¿alguien sabe (1) si es posible la entrada de teclado directa a un tema / tiene un hilo envía una señal visual a un monitor, y en caso afirmativo, (2) cómo hacerlo?
Además, si alguien tiene alguna idea mejor en cuanto a la forma de abordar este problema, soy todo oídos.
Solución
Según este MATLAB hilo grupo de noticias , parece que los hilos no pueden modificar objetos gráficos. Sólo el cliente de escritorio de MATLAB puede hacer eso. Esto significa que usted no puede manejar la actualización de los gráficos de un hilo, y puedo confirmar esto como que lo probamos y no era capaz de modificar las cifras o incluso el root objeto de un hilo.
Sin embargo, creo que puede ser capaz de hacer los gráficos principales de actualización en MATLAB mientras que un sondeo de asas de hilo para su entrada. He aquí una función de ejemplo para actualizar continuamente una pantalla hasta que un hilo de espera para la entrada de KbCheck
está en marcha final:
function varargout = plot_until_input
obj = createJob(); %# Create a job
task = createTask(obj,@get_input,4,{deviceNumber}); %# Create a task
submit(obj); %# Submit the job
waitForState(task,'running'); %# Wait for the task to start running
%# Initialize your stimulus display here
while ~strcmp(get(task,'State'),'finished') %# Loop while the task is running
%# Update your stimulus display here
end
varargout = get(task,'OutputArguments'); %# Get the outputs from the task
destroy(obj); %# Remove the job from memory
%#---Nested functions below---
function [keyIsDown,secs,keyCode,deltaSecs] = get_input(deviceNumber)
keyIsDown = false;
while ~keyIsDown %# Keep looping until a key is pressed
[keyIsDown,secs,keyCode,deltaSecs] = KbCheck(deviceNumber);
end
end
end
Yo era capaz de ejecutar correctamente la función anterior con algunas sencillas rutinas de trazado y reemplazar el código en get_input
con un simple pausa declaración y un valor de retorno. Estoy seguro de si KbCheck
trabajará en un hilo, pero esperamos que pueda ser capaz de adaptar este para sus necesidades.
Aquí está la documentación de las funciones Parallel Computing Toolbox utilizados en el código anterior: createJob
, createTask
, submit
, waitForState
, destroy
.
Otros consejos
No sé de una manera cómo se puede hacer esto con el procesamiento en paralelo.
Sin embargo, una característica que podría ser capaz de uso es el href="http://www.mathworks.com/help/techdoc/matlab_prog/f9-38055.html" rel="nofollow"> objeto de temporizador . Se podría establecer el objeto de temporizador para que consulte el mecanismo de entrada, y, si no se detecta nada, cambiar el valor de una variable global. A continuación, se inicia la rutina de estímulo. En el bucle while en el que va a actualizar la pantalla, a mantener el control de la variable global para un cambio del objeto de temporizador.
Usted tiene que hacer frente a los 20 ms de latencia en el dispositivo de entrada. Si es demasiado lento a continuación, obtener otro dispositivo de entrada. Usted puede obtener una buena sincronización sub-milisegundo con cajas de respuesta adecuados.
Toda esta charla sobre el roscado es un error y no se aplica al marco PTB.