How to implement a 'speed limit' for GUI button press?
Mostrar comentarios más antiguos
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 comentario
John
el 19 de Abr. de 2011
Respuesta aceptada
Más respuestas (2)
Matt Fig
el 19 de Abr. de 2011
1 voto
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
el 19 de Abr. de 2011
0 votos
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 comentarios
Matt Fig
el 19 de Abr. de 2011
I thought of this too, but apparently 'busyaction' doesn't work like that. I don't know why, but in 2007b, busyaction set to cancel behaves exactly as if set to queue.
Matt Fig
el 19 de Abr. de 2011
Here is an example of how this does not work in 2007b.
uicontrol('style','slider',...
'callback','disp(''1''),sort(rand(1,5e6));disp(''2'')',...
'interrupt','off',...
'busyaction','cancel');
Clicking 3 times fast on the right arrow, we should only see one set of numbers, because the busyaction is set to cancel and the interruptable property is set to off. I see three sets of numbers....
Malcolm Lidierth
el 19 de Abr. de 2011
Another reason to use isMultipleCall?
Yair Altman
el 21 de Jul. de 2011
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.
Categorías
Más información sobre Creating, Deleting, and Querying Graphics Objects en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!