Программа не завершается правильно - PullRequest
2 голосов
/ 04 мая 2011

Я пишу приложение для компьютерного зрения (C ++ и OpenCV). Я создаю графический интерфейс для него с помощью wxWidgets - это очень просто; событие нажатия кнопки вызывает приложение трекера для запуска.

Мой вызов для закрытия приложения (т. Е. При нажатии кнопки закрытия) выглядит следующим образом:

// Exiting the App
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    // true is to force the frame to close
    Close(true);
}

Это обычно работает с более простыми приложениями с графическим интерфейсом. Однако в этом случае фрейм исчезает, и в диспетчере задач процесс, похоже, продолжает работать и удерживает память. Это очень раздражает, потому что, если я запускаю или отлаживаю приложение, а затем внесу некоторые изменения и попытаюсь снова запустить его, не прерывая процесс вручную, компилятор выдаст ошибку ссылки, потому что .exe -

не найден или не создан последней добавочной ссылкой.

Попытка вставки грубой силы выхода (1); в методе onQuit, но это приводит к сбою приложения.

Я не уверен, что это такое .. при работе без графического интерфейса приложение работает и нормально завершает работу (хотя оно вызывается немного по-другому - из функции main (), а не из обработчика событий нажатия кнопки, который вызывает абстрактный базовый класс).

Возможно ли это потому, что класс объявляется с глобальной областью действия? Как, в одном файле у меня есть экземпляр класса, объявленный вне какого-либо метода класса? Возможно, wxWidgets не может справиться с этим?

Для уточнения:

Рамка, которую я закрываю, является рамкой верхнего уровня. У меня не было проблем с точно таким же кодом GUI, когда он не вызывает методы компьютерного зрения.

Я специально не кодировал многопоточность, но для начала я получил сообщение об ошибке «Ошибка: невозможно инициализировать OLE». Чтобы это исправить, я должен был установить для wxUSE_DRAG_AND_DROP, wxUSE_CLIPBOARD, wxUSE_OLE и wxUSE_OLE_AUTOMATION значение 0 (вместо 1), а затем (пере) скомпилировать wxWidgets.

Просто интересно, есть ли какая-то многопоточность с HighGUI, несовместимая с WxWidgets? Кто-нибудь еще сталкивался с подобными проблемами?

Ответы [ 3 ]

1 голос
/ 05 мая 2011
::wxExit

void wxExit()

Выход из приложения после вызова wxApp :: OnExit. Следует использовать только в чрезвычайной ситуации: обычно кадр верхнего уровня следует удалять (после удаления всех остальных кадров), чтобы завершить приложение. См. WxCloseEvent и wxApp.

Включить файлы

<wx/app.h>

Вы также можете просто вызвать функцию crt exit (), которая мгновенно отключит все.

Однако, если вы хотите более вежливые, чем эти довольно жестокие методы (что вы, возможно, захотите сделать, в частности, если вы поместили какой-то специальный закрытый код в wxApp :: OnExit ) затем вы хотите найти окно верхнего уровня и закрыть его. Для этого из любого места в вашем коде

wxGetApp().GetTopWindow()->Close()
1 голос
/ 05 мая 2011

Спасибо за помощь, я решил проблему. Кажется довольно очевидным сейчас, но не мог понять это в то время!

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

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

Разница с новым кодом GUI состоит в том, что, когда класс оболочки закончен - программа все еще работает. Подсказка заключалась в том, что даже когда приложение для компьютерного зрения закончилось, синий свет на моей веб-камере все еще светил.

* Обязательно вызовите cvReleaseCapture (& capture); освободить этот поток и освободить аппаратное обеспечение *

0 голосов
/ 04 мая 2011

Ваш вызов Close только закрывает фрейм, но не останавливает приложение, потому что это не последнее окно верхнего уровня. WxWidget содержит тему Обзор удаления окна . В нем говорится, что

Приложение wxWidgets автоматически закрывается при уничтожении последнего окна верхнего уровня (wxFrame или wxDialog). Поместите любой код очистки всего приложения в wxApp :: OnExit (это виртуальная функция, а не обработчик событий).

Является ли ваша рамка рамкой верхнего уровня? Если нет, возможно, вам придется вызвать Close или Destroy в кадре верхнего уровня.

...