2017-07-25 30 views
1

我有一個Matlab GUI代碼,可以讓您在軸上繪圖並將座標傳遞給Simulink中的常量。當按住鼠標按鈕時,它應該繪製座標軸併發送座標,當它不是時,它應該發送座標但不應繪製。下面是代碼: `matlab set_param函數在循環中不起作用

function figure1_WindowButtonUpFcn(hObject, eventdata, handles) 
    % hObject handle to figure1 (see GCBO) 
    % eventdata reserved - to be defined in a future version of MATLAB 
    % handles structure with handles and user data (see GUIDATA) 
    global bool; 
    bool=false; 
    set(handles.figure1,'WindowButtonMotionFcn',@(hObject,eventdata)figure1_WindowButtonMotionFcn(hObject,eventdata,guidata(hObject))); 
    %set the WindownButtonMotionFcn back in order to make it work again 



function figure1_WindowButtonDownFcn(hObject, eventdata, handles) 
    set(handles.figure1,'WindowButtonMotionFcn',@empty); %change the windowbuttonmotionfcn in order not to let it work 
    global bool; 
    bool=true; 
    global lastX; 
    global lastY; 
    x=0; 
    while bool 
     coord=get(handles.axes4,'CurrentPoint'); 
     if coord(1)<0.003 
      coord(1)=0.003 
      x=0; 
     end 
     if coord(1)>1 
      coord(1)=1 
      x=0; 
     end 
     if coord(3)<0 
      coord(3)=0 
      x=0; 
     end 
     if coord(3)>0.95 
      coord(3)=0.95 
      x=0; 
     end 
     if x>1 
      arrayX=[lastX coord(1)]; 
      arrayY=[lastY coord(3)]; 
      line(arrayX,arrayY); 
      set_param('dosya_yukle_deneme/Constant','value',num2str(coord(1))); 
     end 
     x=x+1; 
     lastX=coord(1); 
     lastY=coord(3); 
     drawnow; 
    end 

function empty(~,~,~) 

% --- Executes on mouse motion over figure - except title and menu. 
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles) 
    coord=get(handles.axes4,'CurrentPoint'); 
    set_param('dosya_yukle_deneme/Constant','value',num2str(coord(1))); 

當鼠標按鈕被按下時,它繪製的線條,但set_param功能不起作用。但是,figure1_WindowButtonMotionFcn中的那個在需要時工作得很好。看起來問題是while循環。任何幫助,將不勝感激。

回答

1

我解決了這個問題!所以我發現代碼從一開始就工作。我把這個常量連接到了一個顯示器上,而figure1_WindowButtonMotionFcn正在工作,它顯示了這個值,但是當另一個工作正常時。它似乎是MATLAB UI中的一個錯誤;當檢測到鼠標按鈕時,顯示屏不會自行更新。

+2

這不是一個bug;這是因爲while循環阻止了回調的返回。 Matlab GUI是單線程的,所以如果回調沒有返回,那麼GUI被阻塞,並且不能正確更新 - 參見回答 – Tom

+0

@Tom好吧,它實際上工作。但起初,我並沒有想到它也能工作:D –

3

您不能在figure1_WindowButtonDownFcn回調中運行while循環,因爲Matlab GUI是單線程的。這意味着while循環阻塞了Matlab GUI,並防止正確更新。你需要讓回調函數返回,以便Matlab能夠更新GUI。這是Matlab中GUI回調的一般規則;無論你在回調中做什麼都會阻止GUI。

事實上,根本不需要while循環,因爲每次光標更改時都會回調WindowButtonMotionFcn。您將代碼放入循環中,並調用figure1_WindowButtonMotionFcn回調。您還需要一個額外的全局標誌來指示該按鈕是否關閉,但這很容易創建。 figure1_WindowButtonDownFcn應設置按鈕標誌,figure1_WindowButtonUpFcn將重置按鈕標誌。然後figure1_WindowButtonMotionFcn檢查按鈕標誌是否被設置,如果是,則執行while循環內的代碼。

+1

+1。我還補充說,如果一個_really_需要真正的異步(即多線程)行爲,可以使用'batch'來完成。但是,一致認爲,這裏沒有必要。 –

+0

感謝您的建議。但實際上效果非常好,而且我不需要更好的表現等等。下次我需要再次做這樣的事情時,我會記住這一點。 –