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:

  1. Mostrar estímulo
  2. Teclado de sondeo para la respuesta
    1. si no hay respuesta detecta, de nuevo bucle para 1
    2. 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.

¿Fue útil?

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 .

scroll top