How to implement a 'speed limit' for GUI button press?

조회 수: 4 (최근 30일)
John
John 2011년 4월 19일
Hi, I have a GUI built to flip through slices of large 3D image matrices and adjust visualization parameters. When changing slices with a slider, if the slider is clicked too fast in succession the GUI lags a lot because it is trying to render each intermediate image. I want to add a button press 'speed limit' such that: if slider clicks > 1 && time < threshold, skip displaying the intermediate images and just generate display for the final slider setting, else, refresh the image for each slider click, end
I don't know what functions I could use to implement that, as it's not really a timeout. Schemes I can think of using tic, toc or uiwait would require a second click which may not be coming. Any ideas would be appreciated! Thanks!
  댓글 수: 1
John
John 2011년 4월 19일
Thanks to all for the suggestions. While Matt's answer works, it forces the user to wait between clicks whereas Paulo's answer allows the user to click at will and provides them with a smoother experience regardless. Also, I found that adding 'drawnow' at the end of the image generation code made that function a lot more responsive, which alone fixed the problem for small to moderately sized data sets.

댓글을 달려면 로그인하십시오.

채택된 답변

Paulo Silva
Paulo Silva 2011년 4월 19일
Use a timer (execution mode 'singleShot') in the slider callback:
  1. Check if the timer is running, if not start it and run the slider code
  2. If the timer is already running ignore all the rest of the slider code
  댓글 수: 1
Sean de Wolski
Sean de Wolski 2011년 4월 19일
Good answer.
You could also have the timer disable the slider until it's done.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Matt Fig
Matt Fig 2011년 4월 19일
Just set the 'enable' property to 'inactive' as the first command of the callback, then as the last command, set the 'enable' property to 'on'.

Malcolm Lidierth
Malcolm Lidierth 2011년 4월 19일
Change the callback mode to to 'cancel' instead of 'queue'. Alternatively, test for multiple calls in the callback using isMultipleCall from the FEX. if isMultipleCall();return;end http://www.mathworks.com/matlabcentral/fileexchange/26027
  댓글 수: 4
Malcolm Lidierth
Malcolm Lidierth 2011년 4월 19일
Another reason to use isMultipleCall?
Yair Altman
Yair Altman 2011년 7월 21일
Matt - if you add even a short pause(0.1) in your callback string then the busyaction=cancel does indeed run only once, not 3 times. My hunch is that what happens under the hood is that the callback is actually delegated to a separate thread (maybe EDT delegating to the MT?). This delegation happens so quickly that if you double-click the separate clicks do not in fact overlap, and both callbacks will then get executed one after another. However, when you add a pause, it forces the interpreter to use the original thread (instead of delegating), and in this case the clicks *do* overlap and so the second click is discarded.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Visual Exploration에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by