2012-03-30 13 views
3

GUIDで書かれた大きなプログラムでタイマーをテストしていましたが、私はこれらの奇妙な結果に出くわしました。findobjがタイマーコールバックで失敗しました

function checkfordone_openningFcn(hObject, eventdata, handles, varargin) 
… 
handles.t = timer(‘TimerFcn’,@IsDataReady,’ExecutionMode’,’fixedRate’,’Period,4); 

start(handles.t) 

function IsDataReady(timerObject, eventdata) 
    fHandles = findobj(‘type’,’figure’,’tag’,’figure1’) 

end 

タイマー関数のコールバックIsDataReadyは、初めて呼び出されたときにfigure1の有効なハンドルを返します。その後、nullを返すだけです。

答えて

3

私はこの問題を解決するために数日を要しました。これは主に、中規模の展開可能なアプリケーションの奥深くに埋め込まれていたためです。

GUIDEでは、Figure1のHandleVisibilityがコールバックに設定されています(これはデフォルトです)。これは、 "ハンドルはコールバックルーチンやコールバックルーチンによって呼び出される関数内からは表示されますが、コマンドラインから呼び出される関数内では表示されません"ことを意味します。HandleVisibilityは 'on'または 'off'に設定することもできます。上記のコードでは、IsDataReadyがコールバックとして最初に呼び出されたため、findobjがハンドルを検出しました。その後、タイマーは別のスペースで実行されなければならず、findobjはnullを返します。解決方法は、親フィギュアのHandleVisibilityを 'on'に変更するか、findallコマンドを使用することです。

fHandles =のfindAll(0、「タイプ」、」図形」、」タグ」、」図1.’ )

ここでゼロは、ルートオブジェクトを意味し、したがって、すべての子が検索されます。

関連する問題