Графический интерфейс MATLAB зависает после запуска моей программы

Я создаю графический интерфейс, который использует Parallel computing для ускорения моделей Neural network и SVM. Когда я включаю Parallel computing в своем графическом интерфейсе, все (MATLAB, мой графический интерфейс и окно моего кода) зависает, и я также не могу развернуть эти окна, но моя программа работает, используя рабочие процессы, и иногда я вижу обновления на графиках и значениях графический интерфейс Когда я отключаю Parallel computing в своей программе, все нормально. В первой ситуации иногда мой графический интерфейс становится черным (фон графического интерфейса, кнопки, текстовые поля и поля редактирования хороши), но значения обновляются в итерациях созданного графического интерфейса.

Что это за проблема?

Спасибо.


person Eghbal    schedule 14.08.2014    source источник
comment
Это графический интерфейс, созданный с помощью GUIDE?   -  person patrik    schedule 14.08.2014
comment
да. Я создал его с помощью GUIDE.   -  person Eghbal    schedule 14.08.2014
comment
Хорошо, я просто тогда догадываюсь, что стандартные подпрограммы вполне стабильны. Интересно, параллельные вычисления выполняются постоянно или только изредка?   -  person patrik    schedule 14.08.2014
comment
Я могу выбрать в своем графическом интерфейсе, что я хочу использовать parallel computing или нет. Настройки по умолчанию для этой функции включены, поэтому в 90% случаев я использую parallel computing (цикл Parfor).   -  person Eghbal    schedule 14.08.2014
comment
Хорошо, но я скорее имел в виду, что когда вы запускаете графический интерфейс, выполняются ли параллельные вычисления с самого начала и заканчиваются, когда графический интерфейс закрывается, или процесс неактивен в течение некоторого времени, когда вы запускаете графический интерфейс?   -  person patrik    schedule 14.08.2014
comment
Мой графический интерфейс использует алгоритм оптимизации для оптимизации моей нейронной сети или модели SVM. Я иногда повторяю свою нейронную сеть (обучение) или SVM с изменением цикла parfor и возвращаю значения другим функциям (коды оптимизации). Я не уверен, но в новой версии MATLAB (R2014a) MATLAB закрывает параллельные вычисления (parfor) после завершения. Поэтому я все время вызываю цикл «parfor» для расчета стоимости. + Я не использовал parpoolдо parfor в R2014a   -  person Eghbal    schedule 14.08.2014
comment
Хорошо, но графический интерфейс просто становится черным, а ты ничего не делаешь? И просто чтобы быть уверенным, вы не пытаетесь обновить графический интерфейс внутри parfor-цикла, верно?   -  person patrik    schedule 14.08.2014
comment
да. Когда я оставляю его в покое и возвращаюсь через некоторое время, все нормально. Если я перемещаю графический интерфейс, сворачиваю и разворачиваю его, он зависает или иногда цвет фона становится черным. (Иногда я не могу максимизировать его после минимизации!)   -  person Eghbal    schedule 14.08.2014
comment
Хорошо, я вижу. Я слышал, что у людей возникают проблемы с этим, но я не совсем уверен, что вызывает это. Я также предполагаю, что это не проблема, если вы не запускаете параллельные вычисления? Однако у меня есть предположение. Предполагается, что данные графика в Matlab хранятся как указатель на какое-то другое место. Когда вы перемещаете графический интерфейс, Matlab пытается достичь этого места в памяти. Однако, чтобы предотвратить неопределенное поведение, данные не могут быть доступны до окончания цикла parfor. Это может привести к тому, что графический интерфейс станет черным, пока он не сможет обновиться. Что может быть не раньше, чем через некоторое время. Имеет ли это смысл для вас?   -  person patrik    schedule 14.08.2014
comment
Спасибо за ответ. Я думаю, это правда. Когда я использую getappdata в цикле parfor, MATLAB не может его запустить, потому что getappdata возвращает сохраненные данные из ОЗУ. Что вы думаете о проблеме с графическим интерфейсом? Можем ли мы найти какое-либо решение для него?   -  person Eghbal    schedule 14.08.2014


Ответы (1)


Извините за столь поздний ответ. Здесь сложно дать однозначный ответ на решение. Проблема довольно сложная, и с большей частью кода мы ничего не можем сделать. То, что происходит в parfor, вероятно, заключается в том, что Matlab устанавливает какую-то блокировку (mutex или что-то еще) на элементы, к которым он обращается в данный момент. Кроме того, поскольку parfor работает параллельно, маловероятно, что какие-либо данные в цикле останутся нетронутыми. Единственное решение, которое я вижу, это запускать более короткие процессы. Это позволит вашему графическому интерфейсу обновляться между процессами.

Вероятно, было бы целесообразно поместить drawnow там, где вы хотите обновить графический интерфейс.

Другими вариантами также могут быть размещение графического интерфейса в месте, где вам не нужно его перемещать или прикреплять к главному окну в Matlab. Но это ярлыки, которые только скроют проблему.

person patrik    schedule 14.08.2014
comment
Патрик, спасибо за ответ. Я нашел решение для этого с вашей помощью. Я ставлю pause(0.0001) и drawnow в конец цикла parfor или после него. Теперь время почернения составляет 1 секунду. через 1 секунду графический интерфейс становится нормальным. С помощью этого решения теперь мы можем найти для него общее решение. + Я не знаю, как удалить его полностью (1 секунда, чтобы вернуться в нормальное состояние). Пожалуйста, добавьте этот ответ, теперь мы можем поговорить о ведьминских функциях, таких как drawnow или других функциях, которые мы можем использовать, или о том, где мы должны разместить эти функции. - person Eghbal; 14.08.2014
comment
Да, это должно помочь, я думаю. Обычно я бы рекомендовал ставить паузу после цикла. - person patrik; 14.08.2014
comment
Я думаю, что лучшее решение - сделать ничью сейчас за пределами цикла parfor. Я предполагаю, что вы, вероятно, остановите каждый поток в неподходящее время, если он у вас внутри цикла. Я не видел вашего кода, но по описанию кажется, что это программа, которая будет работать некоторое время и динамически обновляться. Это, вероятно, управляется циклом while или около того. Обычно обновление экрана — это последнее, что вы делаете, поэтому я бы рекомендовал иметь pause или drawnow в конце основного цикла. - person patrik; 14.08.2014
comment
Еще раз спасибо за вашу помощь. Каковы ваши рекомендации относительно продолжительности функции pause? - person Eghbal; 14.08.2014
comment
@ user2991243 это зависит от кода. Просто попробуй вывести его за пределы parfor loop. Это единственная рекомендация. - person patrik; 14.08.2014