MATLAB GUIDE gui listbox间歇性地消失,看似过时的错误

eli*_*eli 6 matlab user-interface intermittent race-condition matlab-guide

我正在使用GUIDE构建一个简单的MATLAB gui.我有一个项目列表框.大多数情况下,它按预期工作,但有时(通常在我使用GUIDE编辑图形后)填充列表框会导致它消失,以及此消息:

Warning: single-selection listbox control requires a scalar Value
Control will not be rendered until all of its parameter values are valid 
Run Code Online (Sandbox Code Playgroud)

这种行为无法调试!当我单步执行时,它按预期工作(我怀疑它是一种线程竞赛或其他东西).此外,在相同条件下重新启动MATLAB环境后,它通常会消失.

在此错误中找到的所有文档都涉及MATLAB的先前/古代版本(我使用的是R2010a).

任何有关此主题的想法或信息将不胜感激!


编辑:感谢米哈伊尔,我似乎已经解决了这个问题.我在这里发布我的代码以供将来参考.

经过大量的调试打印和疯狂点击之后,我发现有时候当您询问列表框选择的内容时,会得到一个空的结果.这个问题和其他问题使事情变得混乱.我把所有的写作交互都放到了一个集中的函数中,然后我写了一些测试代码,以确保事情保持原样.

请注意,这已经在我自己的环境(在R2010a上)进行了测试,而不是广泛的.此外,代码有点多余,但无论如何它让我感觉很好.(即itemcount不能小于0 ...)

function ensure_listbox_ok(handles)

%check to make sure it does not suck - ask what it has
thestrings = get(handles.listbox_files, 'String');
selection = get(handles.listbox_files, 'Value');

itemcount = length(thestrings);

betterselection = selection;

if(itemcount <= 0)
    betterselection = 1;
else
    if(selection > itemcount)
        betterselection = itemcount;
    end
end

%never use zero!!!! even if 1 is out of bounds.
if(isempty(betterselection) || betterselection <= 0)
    betterselection = 1;
end

%uncomment for debug logging
%display(['Was: ' num2str(selection) ', cleaned: ' num2str(betterselection)]);

%update if we are out of bounds.
if(isempty(selection) || betterselection ~= selection)
    set(handles.listbox_files, 'Value', betterselection);
end
Run Code Online (Sandbox Code Playgroud)

Mik*_*ail 2

这是一个已知的编程错误,与竞争条件无关!

它应该是这样工作的:

对于 Popup 和单选 Liststring属性必须不为空,即有一些内容。但默认情况下它是空的,因此必须始终定义它。

string在弹出窗口中显示的(在列表中突出显示的)项目由两个属性(作为字符串元胞数组)和value(默认情况下)定义1

获取空数组中的第一个元素显然不起作用,因此无法呈现控件!

您的列表框控件是单选的 - 其属性min<maxvalue是标量且 >0。min如果 property > ,列表框(但不是弹出窗口)可以进行多项选择max,在这种情况下value可以是一个数组(这意味着也为空),并且空string不会导致问题。

阅读 MATLAB 帮助以了解 uicontrol 属性string, value, min, max, listboxtop

在实践中

  • 你说它在用GUIDE编辑后就显现出来了。GUIDE 创建代码隐藏。编辑后,旧的代码隐藏有时仍保留在原处。
  • 有时,MATLAB 对一条语句内的顺序很敏感,即天真地set(hlist, 'value', 2, 'string', {'aa','bb'})设置valuebefore足够长并使 uicontrol 无效。2string
  • MATLAB 是有 bug 的,每个新版本每年两次都会删除旧版本并带来新的 bug。如果您确定调试模式无法正常工作,则需要 MATLAB 支持。我运行与 m 代码、p 代码和编译的 exe 相同的代码 - 相同的代码的行为不同,主要是 GUI 的工作方式不同。