Domanda

Psychtoolbox in MATLAB per eseguire un paradigma psicologia comportamentale. Nell'ambito del paradigma, gli utenti devono visualizzare uno stimolo visivo e rispondere ad esso utilizzando un meccanismo di input. Per una tastiera, questo funziona nel seguente modo:

  1. show stimolo
  2. Tastiera sondaggio per la risposta
    1. se nessuna risposta rilevato, ciclo ritorna 1
    2. se la risposta rilevato, pausa e andare avanti con lo script

Questo funziona bene per una tastiera, come nel punto 2 richiede tra 1-2 ms. Il problema nasce quando uso di un meccanismo di input alternativo; in tal caso, il passo 2 prende ~ 20 ms. (Ho bisogno di questo ingresso alternativo per eseguire lo studio, e che devono essere considerati fatto immutabile.) Poiché lo stimolo cambia con un brevissimo periodo, questo aggiunto pause ritardo compito.

Il mio pensiero attuale è quella di tentare di utilizzare l'elaborazione parallela, spettacoli in modo tale che un thread lo stimolo, e un altro sondaggi filo della tastiera. Attualmente sto usando il Parallel Computing Toolbox per fare questo. Il problema che sto avendo è che non so come dirigere input da tastiera a un filo "parallelizzato". Qualcuno sa (1) se è possibile l'input da tastiera direttamente ad una discussione / hanno un filo inviare un segnale visivo ad un monitor, e se sì, (2) come si fa?

Inoltre, se qualcuno ha un'idea migliore su come affrontare questo problema, io sono tutto orecchi.

È stato utile?

Soluzione

Secondo questa MATLAB discussione newsgroup , sembra che fili non può modificare gli oggetti grafici. Solo il client desktop MATLAB può farlo. Ciò significa che non è possibile gestire l'aggiornamento di grafica da un filo, e posso confermare questo come ho provato e non è stato in grado di modificare i dati o anche il root oggetto da un thread.

Tuttavia, penso che si può essere in grado di fare le principali grafica di aggiornamento in MATLAB, mentre un polling handle di thread per il vostro input. Ecco una funzione di esempio per l'aggiornamento continuo un display finché un thread in attesa di input da KbCheck esegue finito:

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

sono stato in grado di eseguire con successo la funzione di cui sopra con qualche semplice tracciato routine e sostituendo il codice in get_input con un semplice pausa dichiarazione e un valore di ritorno. Sono incerto se KbCheck lavorerà in un thread, ma spero che sarò in grado di adattare questo per le vostre esigenze.

Ecco la documentazione per i Parallel Computing Toolbox funzioni utilizzate nel codice qui sopra: createJob , createTask , submit , waitForState , destroy .

scroll top