Неверная метка всплывающей подсказки при медленном обратном вызове режима передачи данных - PullRequest
0 голосов
/ 17 марта 2020

Довольно легко добавить пользовательскую подсказку данных

f = figure();
plot( 1:100, sort(rand(100,1)) );
dc = datacursormode( f );
set( dc, 'UpdateFcn', @onDataCursorUpdate );

function txt = onDataCursorUpdate( tip, evt )
    txt = {sprintf( 'X: %g', tip.Position(1) ), ...
           sprintf( 'Y: %g', tip.Position(2) )};
end

Но функция обновления может занять некоторое время, чтобы получить информацию о подсказке данных.

В моем случае данные, которые я хочу включить в txt, должны быть получены из запроса к базе данных. Я понимаю, что это неэффективно с точки зрения производительности, но гораздо эффективнее с точки зрения памяти, чем сохранение в памяти всех возможных атрибутов подсказок данных!

function txt = onDataCursorUpdate( tip, evt )
    info = mySlowQuery( tip.Position ); % fetch some data about this point
    txt = {sprintf( 'X: %g', tip.Position(1) ), ...
           sprintf( 'Y: %g', tip.Position(2) ), ...
           sprintf( 'Info: %s', info )};
end

Этот запрос может занять минуты (!), И, к сожалению, MATLAB обновляет положение всплывающей подсказки перед обновлением метки, поэтому вы можете получить следующую последовательность событий:

issue

Есть ли способ предотвратить это, чтобы не было периода, когда метка неверна?

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете напрямую взаимодействовать с подсказкой данных в начале обратного вызова, чтобы очистить метку, а затем запустить тело обратного вызова. Выход txt по-прежнему автоматически присваивается свойству datatip String, но вы можете вручную изменить его ранее в функции:

function txt = onDataCursorUpdate( tip, evt )
    % Clear the string first, use "loading..." as placeholder text
    txt = {sprintf( 'X: %g', tip.Position(1) ), ...
           sprintf( 'Y: %g', tip.Position(2) ), ...
           'Info: loading...'};
    tip.String = txt;
    % Now run the slow update
    info = mySlowQuery( tip.Position ); % fetch some data about this point
    txt = {sprintf( 'X: %g', tip.Position(1) ), ...
           sprintf( 'Y: %g', tip.Position(2) ), ...
           sprintf( 'Info: %s', info )};
end
...