2011-05-04 130 views
1

我正在编写计算机视觉应用程序(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是

not found or not built by the last incremental link.

尝试插入强力退出(1);在onQuit方法,但它导致应用程序崩溃。

我不知道它是什么..当没有GUI的情况下运行,应用程序运行并终止正常(尽管它被称为稍微不同 - 从main()函数而不是按钮按下事件处理程序调用抽象基类)。

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

澄清:

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

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

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

+0

听起来像你有多个线程,并调用'Close()'不会杀死所有的线程。 – Dima 2011-05-04 18:03:59

+0

如果您没有连接到由窗口生成的按钮按下事件,您认为按下按钮时会发生什么?设置断点和调试或显示更多相关的代码。 – AJG85 2011-05-04 18:04:08

回答

0

感谢您的所有帮助,我已经解决了此问题。现在似乎相当明显,但当时无法解决!

最初,我的电脑视觉应用程序是从主函数调用的。但是,使用新的GUI代码不需要主体,所以我用shell类替换了原始主体。

虽然我一直很小心,在我的计算机视觉类的方法中释放分配的内存,我还没有如此小心的原始主要功能,因为一旦该功能结束,以前使用的所有内存将被程序清除定期退出。

与新的GUI代码的区别在于,当shell类完成时 - 程序仍在运行。事实上,即使计算机视觉应用程序结束,我网络摄像头上的蓝灯仍然闪烁着。

*请务必致电cvReleaseCapture(& capture);释放该线程并释放硬件*

0

您致电Close只会关闭框架,但不会停止应用程序,因为它不是最后一个顶层窗口。 wxWidget包含一个主题Window Deletion Overview。它规定

A wxWidgets application automatically exits when the last top level window (wxFrame or wxDialog), is destroyed. Put any application-wide cleanup code in wxApp::OnExit (this is a virtual function, not an event handler).

您的框架是否是顶层框架?如果不是,您可能需要在顶级框架上拨打CloseDestroy

+0

谢谢,但请参阅原始问题中的编辑。 – kylestephens 2011-05-04 22:45:22

1
::wxExit 

void wxExit() 

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

包含文件

<wx/app.h> 

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

但是,如果你想比这些相当残暴的手段(这可能需要特别做的,如果你已经把一些特殊的关闭代码wxApp ::的OnExit )更有礼貌,那么你要查找的顶级窗口并关闭它。要在代码中的任何位置执行此操作,请执行以下操作:

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

那么,你有没有尝试过wxExit()和exit()? – ravenspoint 2011-05-04 22:11:25

+0

是的,将它放在OnExit()方法中,但它不起作用。 也尝试了wxGetApp() - > GetTopWindow() - >关闭(),但这是无效的语法,我很确定我在任何情况下关闭我的顶级窗口。 – kylestephens 2011-05-04 22:18:39

+0

如果您需要帮助,您需要在遵循人们的建议时加倍小心。尝试调用:: wxExit()并调用exit()。对于wxGetApp,你使用DECLARE_APP – ravenspoint 2011-05-04 22:24:38