【发布时间】:2011-05-04 17:54:11
【问题描述】:
我正在编写一个计算机视觉应用程序(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 不一致的线程?有没有其他人遇到过类似的问题?
【问题讨论】:
-
听起来你有多个线程,调用
Close()不会杀死所有线程。 -
如果您没有挂钩到窗口生成的按钮按下事件,是什么让您认为按下按钮时会发生什么?设置断点并调试或显示更多相关代码。