程序不能正确终止

时间:2011-05-04 17:54:12

标签: c++ wxwidgets

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

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

// 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不一致的某种线程?还有其他人遇到过类似的问题吗?

3 个答案:

答案 0 :(得分:1)

::wxExit

void wxExit()

调用wxApp :: OnExit后退出应用程序。只应在紧急情况下使用:通常应删除顶级框架(删除所有其他框架后)以终止应用程序。请参阅wxCloseEvent和wxApp。

包含文件

<wx/app.h>

您也可以简单地调用crt函数exit(),它会立即关闭所有内容。

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

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

答案 1 :(得分:1)

感谢所有帮助,我解决了这个问题。现在似乎相当明显但当时无法弄明白!

最初,我的计算机视觉应用程序是从主要功能调用的。但是,使用新的GUI代码不需要main,所以我用shell类替换了原始的main。

虽然我一直小心翼翼地在我的计算机视觉类的方法中释放已分配的内存,但我对原始主函数并没有那么小心,因为一旦该函数结束,之前使用的所有内存都将被程序的常规清除离开。

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

*一定要调用cvReleaseCapture(&amp; capture);释放该线程并释放硬件*

答案 2 :(得分:0)

您对Close的调用仅会关闭该帧,但不会停止该应用程序,因为它不是最后一个顶级窗口。 wxWidget包含主题Window Deletion Overview。它说明了

  

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

您的相框是否为顶级相框?如果没有,您可能需要在顶级框架上致电CloseDestroy