队列addlistener事件或事件在美国东部时间的地方

3视图(30天)
每次xlim更改我想运行一些代码。
情节(1:10 0)
L = addlistener (gca),“XLim”,“PostSet”,@my_callback);
如果我用一个侦听器,我似乎错过事件回调是否仍在运行。
因此我想队列属性改变事件回调。这是可能的吗?
另外,有可能回调函数队列在EDT(事件分发线程),这样任何更改不想念?
我能想出的唯一真正丑陋的解决方案是使用一个java类的“PropertyChangeCallback”,因为它似乎对被设置在Matlab中,而不是uicontrol时不要把回调(我认为)通过Matlab改变他们的价值观。
更新:
看来,这是依赖于回调代码。
我曾经是这样的:
disp(现在)
t =抽搐;
暂停(3)
toc (t);
如果你像一个水平放大2 - 3次(很快),只有第一个侦听器回调将运行,即使你已经改变了xlim很多次了。
然而如果代码是:
disp(现在)
t =抽搐;
兰德(r = 1 e8);
toc (t);
然后渲染不会发生,直到代码执行完成。我在这里使用rand()命令导致一个合理的延迟(在我的笔记本电脑1.5 s)
换句话说听众的阻塞行为取决于回调代码。
错过的事件也只会出现在用户输入。在运行代码的事件按顺序运行。例如,试试这个“暂停”版本的回调。在我的例子中我得到了三个事件,而不是1。
集(gca),“xlim”10 [0]);
集(gca),“xlim”20 [0]);
集(gca),“xlim”30 [0]);
4评论
吉姆Hokanson
吉姆Hokanson 2018年1月9日
编辑:吉姆Hokanson 2018年1月15日
为了跟进这之前提交技术支持,因为我没有得到我想要的表现。万博1manbetx我希望以下行为:
1)确保一个函数后一直运行xlim属性变更。我不需要执行下面的每一个变化,但是如果一段时间已经过去了,没有改变(几百毫秒),我希望我的函数运行后更改。更具体地说,我不能错过一个终端事件因为函数的运行。
2)它不应该妨碍其他代码执行很长一段时间。得到最后的改变的一个方法是检查xlim属性函数即将终止。如果属性已经改变了,可以再次运行的函数。然而,这可以继续一段时间,它应该持续执行其他代码块,这是不可取的。
3)适应症的呈现应该几乎立即,即使最后处理延迟。

登录置评。

接受的答案

吉姆Hokanson
吉姆Hokanson 2018年2月5日
我发现了一个不同的解决方案这似乎很好地工作: https://undocumentedmatlab.com/blog/matlab-and-the-event-dispatch-thread-edt
我不明白下面的博客文章细节,但我使用基于callbackOnEDTQueue()函数引用的文章。
所以现在在初始化:
obj。L3 = addlistener (axes_handle.XRuler,“MarkedClean”@ (~ ~)obj.xrulerMarkedClean);
obj。callback_obj =处理(com.mathworks.jmi.Callback,“callbackProperties”);
集(obj.callback_obj,“delayedCallback”@ (~ ~)obj.renderDataCallback ());
xRulerMarkerClean
如果isequal (obj.last_processed_xlim get (obj.axes_handle,“XLim”))
返回
结束
obj.throwCallbackOnEDT ();
throwCallbackOnEDT ()
%一些日志记录没有显示,但是主要的电话是:
obj.callback_obj.postCallback ();

答案(1)

吉姆Hokanson
吉姆Hokanson 2017年11月26日
编辑:吉姆Hokanson 2017年11月27日
这是一个(丑)解决方案。
这个设置功能如下:
  1. 我关心设置监听器。
  2. 高度Java按钮图我隐藏(“可见”、“了”,“HandleVisibility”,“关闭”)
  3. 设置实际的回调,我希望在Java按钮
函数初始化(obj axes_handle)
(obj。j_comp,临时]= javacomponent (“javax.swing.JButton”[],obj.fig_handle);
obj。h_container =处理(临时);
集(obj.h_container,“BusyAction”,“队列”,“可中断”,“关闭”);
obj。axes_handle = axes_handle;
如果verLessThan (matlab的,“8.4”)
size_cb = {“位置”,“PostSet”};
其他的
size_cb = {“SizeChanged”};
结束
obj。L1 = addlistener (axes_handle,“XLim”,“PostSet”@ (~ ~)obj.listenerCallback);
obj。L2 = addlistener (axes_handle size_cb {:}, @ (~ ~) obj.listenerCallback);
集(obj.j_comp,“PropertyChangeCallback”@ (~ ~)obj.renderDataCallback ());
结束
侦听器代码如下。通过启用文本我们在EDT产生感兴趣的回调。
函数listenerCallback (obj)
%注意尝试声明由于异步j_comp被删除
试一试
%流(1%年代\ n, mat2str (get (obj.axes_handle, xlim)));
如果obj。last_string_index = = 1
obj。last_string_index = 2;
obj.j_comp.setText (“一个”);
其他的
obj。last_string_index = 1;
obj.j_comp.setText (“b”);
结束
%流(2%年代\ n, mat2str (get (obj.axes_handle, xlim)));
结束
结束
结束

类别

找到更多的在启动和关闭帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!