Come posso parallelizzare immissione e la visualizzazione in MATLAB?
-
08-10-2019 - |
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:
- show stimolo
- Tastiera sondaggio per la risposta
- se nessuna risposta rilevato, ciclo ritorna 1
- 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.
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
.
Altri suggerimenti
Non so di un modo come si potrebbe fare questo con l'elaborazione parallela.
Tuttavia, una caratteristica che potrebbe essere in grado di utilizzare è il href="http://www.mathworks.com/help/techdoc/matlab_prog/f9-38055.html" rel="nofollow"> oggetto timer . Si potrebbe configurare l'oggetto timer per il polling del meccanismo di input, e, se non viene rilevato nulla, modificare il valore di una variabile globale. Poi, si inizia la vostra routine di stimolo. Nel ciclo while in cui si sta aggiornando il display, si mantiene il controllo della variabile globale per un cambiamento dall'oggetto timer.
È necessario affrontare i 20ms di latenza nel dispositivo di input. Se è troppo lento quindi ottenere un altro dispositivo di input. È possibile ottenere un buon tempismo sub-millisecondo con scatole risposta adeguata.
Tutto questo parlare di threading è fuorviante e non pertinente al quadro PTB.