我正在编写一个计算机视觉应用程序(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 不一致的线程?有没有其他人遇到过类似的问题?
最佳答案
::wxExit
void wxExit()
调用 wxApp::OnExit 后退出应用程序。只应在紧急情况下使用:通常应删除顶级框架(在删除所有其他框架之后)以终止应用程序。参见 wxCloseEvent 和 wxApp。
包含文件
<wx/app.h>
您也可以简单地调用 crt 函数 exit(),它将立即关闭所有内容。
然而,如果你想要比这些相当粗暴的方法更礼貌(你可能想要这样做,特别是如果你在 wxApp::OnExit 中放置了一些特殊的关闭代码 ) 然后你想找到顶层窗口并关闭它。从代码中的任何位置执行此操作
wxGetApp().GetTopWindow()->Close()
关于c++ - 程序没有正确终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5887733/