[Scilab-users] bug when setting gcbo field in a callback function ?

Stéphane Mottelet stephane.mottelet at utc.fr
Sat Sep 29 00:04:08 CEST 2018


Hello Antoine,

Never trust the life time of gcbo, and first copy the value of gcbo like 
this:

function  funcb1()
     h=gcbo
     disp(typeof(h));
     h.callback_type=-1;
     disp(typeof(h));
     h.callback_type=0;
endfunction

With this trick the type of h is always a handle. However, I cannot 
explain why the second syntax using set() always works...

S.

Le 28/09/2018 à 21:00, antoine monmayrant a écrit :
> Hi all,
>
> In a callback function, gcbo is a handle to the calling uicontrol.
> There are 2 ways to set one of the fields of this handle (let's take 
> "callback_type" as an example):
>     (1)    gcbo.callback_type=-1;
> or equivalently
>     (2)    set(gcbo, "callback_type",-1);
>
> In theory, both are perfectly equivalent.
> In practice however, (1) leads to recurrent issues where gcbo is no 
> longer a handle, but a structure!
>
> See below  an example script showing the difference:
> - two slides with equivalent callback functions funcb1 and funcb2, but 
> for the different syntactic sugar (1) or (2).
> - if you play with the top slider in the figure, everything's fine, 
> gcbo remains a handle (see output on the console).
> - if you play with the bottom slider in the figure, gcbo turns into a 
> struct (see output on the console).
>
> Needless to say, this kind of issue made my GUI debugging session 
> really fun.
> To make things even more fun, if you "pause" then execute "funcb1()" 
> step by step, you don't necessarily trigger the bug, it's quite random 
> and fairly unfrequent.
>
> Can you try to reproduce this bug on your computer?
>
> Cheers,
>
> Antoine
>
>
> // BUG_gcbo_set.sce //
> h=scf();
>
> hs1=uicontrol(h, ...
>     "style", "slider", ...
>     "tag", "slide1", ...
>     "backgroundcolor", [1 1 1], ...
>     "value", 0, ...
>     "min", -100, ...
>     "max", 100, ...
>     "sliderstep", [1, 10], ...
>     "position", [20,40,200,20], ...
>     "constraints", createConstraints("border", "top"), ...
>     "callback", "funcb1");
>
> function  funcb1()
>     disp(typeof(gcbo));
>     gcbo.callback_type=-1;
>     disp(typeof(gcbo));
>     gcbo.callback_type=0;
> endfunction
>
>
> hs2=uicontrol(h, ...
>     "style", "slider", ...
>     "tag", "slide1", ...
>     "backgroundcolor", [1 1 1], ...
>     "value", 0, ...
>     "min", -100, ...
>     "max", 100, ...
>     "sliderstep", [1, 10], ...
>     "position", [20,80,200,20], ...
>     "constraints", createConstraints("border", "top"), ...
>     "callback", "funcb2");
>
> function  funcb2()
>     disp(typeof(gcbo));
>     set(gcbo, "callback_type",-1);
>     disp(typeof(gcbo));
>     set(gcbo, "callback_type",0)
> endfunction
>
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users 
>




More information about the users mailing list