MATLABで入力と表示を並列化するにはどうすればよいですか?
-
08-10-2019 - |
質問
私は使用しています PsychToolbox Matlabで行動心理学のパラダイムを実行します。パラダイムの一部として、ユーザーは視覚刺激を表示し、何らかの入力メカニズムを使用して応答する必要があります。キーボードの場合、これは次のように機能します。
- 刺激を示します
- 応答のためのキーボードを投票します
- 応答が検出されない場合は、1に戻ります
- 応答が検出された場合は、スクリプトで壊して先に進みます
ステップ2には1〜2ミリ秒の間にかかるため、これはキーボードで正常に機能します。問題は、私が代替入力メカニズムを使用するときに発生します。その場合、ステップ2には〜20ミリ秒かかります。 (研究を実行するにはこの代替入力が必要です。それは不変の事実と見なされるべきです。)刺激が非常に短いタイムスパンで変化するにつれて、この追加された遅延はタスクを破ります。
私の現在の考えは、1つのスレッドが刺激を示し、別のスレッドがキーボードを投票するように、並列処理を使用しようとすることです。私は現在使用しています 並列コンピューティングツールボックス これをする。私が抱えている問題は、キーボード入力を「並列化された」スレッドに向ける方法がわからないということです。 (1)キーボード入力をスレッドに向けることができるかどうかは、スレッドに視覚信号をモニターに送信することができるかどうか、そしてはいの場合、(2)それを行う方法は知っていますか?
また、誰かがこの問題にアプローチする方法についてより良いアイデアを持っているなら、私はすべて耳を傾けます。
解決
によると このMatlab NewsGroupスレッド, 、スレッドはグラフィックオブジェクトを変更できないようです。デスクトップMATLABクライアントのみがそれを行うことができます。これは、スレッドからのグラフィックスの更新を処理できないことを意味します。これを試したときにこれを確認でき、図を変更することもできませんでした。 ルートオブジェクト スレッドから。
ただし、スレッドが入力のポーリングを処理しながら、Matlabでメイングラフィックスの更新を実行できると思います。こちらが入力を待つスレッドが待機するまでディスプレイを連続的に更新するためのサンプル関数です KbCheck
実行が終了しました:
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
上記の機能をいくつかの単純なプロットルーチンで正常に実行することができ、コードをで交換することができました get_input
シンプルで 一時停止 ステートメントと返品値。私は確信が持てません KbCheck
スレッドで動作しますが、うまくいけば、これをニーズに合わせて適応させることができます。
上記のコードで使用されている並列コンピューティングツールボックス関数のドキュメントは次のとおりです。 createJob
, createTask
, submit
, waitForState
, destroy
.
他のヒント
並列処理でこれを行う方法がわかりません。
ただし、使用できる機能は タイマーオブジェクト. 。タイマーオブジェクトを設定して入力メカニズムを投票し、検出された場合、グローバル変数の値を変更します。次に、刺激ルーチンを開始します。ディスプレイを更新しているwhileループでは、タイマーオブジェクトからの変更についてグローバル変数をチェックし続けます。
入力デバイスの20ミリ秒のレイテンシに取り組む必要があります。遅すぎる場合は、別の入力デバイスを取得します。適切な応答ボックスを使用して、適切なサブミリ秒タイミングを取得できます。
スレッドについてのこのすべての講演は誤っており、PTBフレームワークには適用されません。