程序未正确终止

Program Doesn't Terminate Correctly

本文关键字:终止 程序      更新时间:2023-10-16

我正在写一个计算机视觉应用程序(c++和OpenCV)。我正在创建一个GUI与wxWidgets -这是非常简单的;按下按钮事件调用跟踪器应用程序开始。

我终止应用程序的调用(即点击关闭按钮)如下:

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

这通常适用于更琐碎的GUI应用程序。然而,在这种情况下,框架仍然消失,在任务管理器中,进程似乎继续运行并占用内存。这是非常恼人的,因为如果我运行或调试应用程序,后来做了一些改变,并试图再次运行,没有手动终止进程事先,编译器抛出一个链接错误,因为。exe是

没有找到或没有被最后一个增量链接构建。

尝试插入暴力退出(1);在onQuit方法中,但是这会导致应用程序崩溃。

我不确定它是什么…当没有GUI运行时,应用程序运行和终止良好(尽管它的调用略有不同-从main()函数而不是从调用抽象基类的按钮按下事件处理程序)。

是否可能是因为一个类被声明为全局作用域?在一个文件中,我有一个类的实例外声明的任何类方法?也许wxWidgets不能处理这个?

澄清:

我要关闭的框架是一个顶级框架。当它不调用计算机视觉方法时,我对完全相同的GUI代码没有任何问题。

我没有特别编码任何多线程,但首先,我得到一个错误,说"错误:无法初始化OLE"。为了解决这个问题,我必须将wxUSE_DRAG_AND_DROP, wxUSE_CLIPBOARD, wxUSE_OLE和wxUSE_OLE_AUTOMATION设置为0(而不是1),然后(重新)编译wxWidgets。

只是想知道,是否有某种线程HighGUI正在与WxWidgets不一致?有人遇到过类似的问题吗?

::wxExit
void wxExit()

调用wxApp::OnExit后退出应用程序。只应在紧急情况下使用:通常应该删除顶层帧(在删除所有其他帧之后)以终止应用程序。参见wxCloseEvent和wxApp。

包含文件

<wx/app.h>

你也可以简单地调用crt函数exit(),它会立即关闭一切。

但是,如果您想要比这些相当野蛮的方法更礼貌(如果您在wxApp::OnExit中放置了一些特殊的关闭代码,您可能特别想要这样做)),然后你要找到顶层窗口并关闭它。要在代码中的任何地方执行此操作

wxGetApp().GetTopWindow()->Close()

谢谢你的帮助,我已经解决了这个问题。现在看起来相当明显,但当时无法理解!

最初,我的计算机视觉应用程序是从main函数调用的。然而,有了新的GUI代码,就不需要main了,所以我用shell类代替了原来的main。

虽然我在计算机视觉类的方法中很小心地释放了分配的内存,但我对原始main函数却没有那么小心,因为一旦该函数结束,之前使用的所有内存都会被程序的常规退出所清除。

与新GUI代码的不同之处在于,当shell类完成时-程序仍在运行。线索是,即使计算机视觉应用程序已经结束,我的网络摄像头上的蓝光仍在闪烁。

*确保调用cvReleaseCapture(&capture);*

Close的调用只关闭了框架,但没有停止应用程序,因为它不是最后一个顶层窗口。wxWidget包含一个主题Window Deletion Overview。它声明

当最后一个顶层窗口(wxFrame或wxDialog)被销毁时,wxWidgets应用程序会自动退出。把所有应用程序范围的清理代码放在wxApp::OnExit中(这是一个虚函数,不是事件处理程序)。

你的框架是顶层框架吗?如果没有,您可能必须在顶级框架上调用CloseDestroy