2011-05-04 127 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