J'écris une application de vision par ordinateur (C++ et OpenCV). Je crée une interface graphique avec wxWidgets - c'est très simple; un événement de bouton-presse appelle l'application de suivi pour commencer.Le programme ne se termine pas correctement
Mon appel à mettre fin à l'application (à savoir le bouton cliquer pour fermer) est la suivante:
// Exiting the App
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
// true is to force the frame to close
Close(true);
}
Cela fonctionne généralement avec les applications de l'interface graphique plus triviales. Cependant, à cette occasion, le cadre disparaît encore, dans le gestionnaire de tâches, le processus semble continuer à fonctionner et à maintenir la mémoire. Il est très ennuyeux parce que si je lance ou déboguer l'application et ensuite faire quelques changements et essayer de courir à nouveau, sans terminer le processus manuellement au préalable, le compilateur génère une erreur de lien, car le .exe est
not found or not built by the last incremental link.
ai essayé d'insérer un sortie de force brute (1); dans la méthode onQuit mais cela provoque le blocage de l'application. Je ne suis pas sûr de ce que c'est .. lors de l'exécution sans l'interface graphique, l'application s'exécute et se termine bien (mais il est appelé légèrement différemment - de la fonction main() au lieu d'un gestionnaire d'événements bouton-presse appelle une classe de base abstraite).
Est-il possible que ce soit parce qu'une classe est déclarée avec une portée globale? Comme dans, dans un fichier j'ai une instance d'une classe déclarée en dehors de toute méthode de classe? Peut-être que wxWidgets ne peut pas gérer cela?
Pour clarifier:
Le cadre Je ferme est un cadre de niveau supérieur. Je n'ai eu aucun problème avec le même code GUI quand il n'appelle pas les méthodes de vision par ordinateur.
Je n'ai pas spécifiquement codé de multi-threading mais pour commencer, j'obtenais une erreur qui disait "Erreur: Impossible d'initialiser OLE". Pour résoudre ce problème, j'ai dû mettre wxUSE_DRAG_AND_DROP, wxUSE_CLIPBOARD, wxUSE_OLE et wxUSE_OLE_AUTOMATION à 0 (au lieu de 1), puis (re) compiler wxWidgets.
Je me demandais juste s'il y a une sorte de threading en cours avec HighGUI qui n'est pas cohérent avec WxWidgets? Quelqu'un d'autre a-t-il rencontré des problèmes similaires?
Semble que vous avez plusieurs threads, et appelant 'Close()' ne les tue pas tous. – Dima
Si vous n'êtes pas accroché dans l'événement de presse bouton généré par la fenêtre, qu'est-ce qui vous fait penser que quelque chose va se passer lorsque le bouton est pressé? Définir des points d'arrêt et déboguer ou afficher du code plus pertinent. – AJG85