2013-07-29 53 views
0

我注意到,當我使用函數GetOpenFileName時,很多線程在我的應用程序中被分配。在對話框關閉並且函數返回後,如何去除這些對象?我在這些線程中也遇到過SIGSEGV錯誤,這些錯誤不會導致我的應用程序崩潰,但它們仍然很煩人,因爲它們不知從何而來,並且可能會在以後導致嚴重的內存問題,並且win32 api也不應該像這樣有缺陷,應該如何?難道我做錯了什麼?如何GC(刪除)GetOpenFileName的線程

另外我是c/C++的初學者,所以請不要太過於苛刻。

我的代碼:

OPENFILENAME open; 
ZeroMemory(&open, sizeof(open)); 
char szFileName[2048] = {}; 

open.lStructSize = sizeof(OPENFILENAME); 
open.hwndOwner = NULL; 
open.lpstrFilter = "Képek\0*.jpg;*.jpeg;*.gif;*.png;*.bmp\0\0"; 
open.lpstrFile = szFileName; 
open.nFileOffset = 1; 
open.nMaxFile = 2048; 
open.lpstrTitle = "Képek kiválasztása.."; 
open.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST; 

std::string links = ""; 
if (GetOpenFileName(&open)) { 
    ... 
} 

回答

2

沒有什麼可以做這些線程。該對話框確實創建了一些由操作系統自己管理的工作線程,還可以安裝第三方的資源管理器插件,這些插件也可以通過對話框使用資源管理器間接加載並創建自己的線程。只要對話框沒有崩潰你的代碼,就忽略多餘的線程。它們是與您的應用無關的OS層線程。

+0

那又如何分配內存?有沒有辦法擺脫那些東西?操作系統保持這些線程和內存與它們相關聯的任何原因?他們是否被重用,如果我只在程序中調用這個函數,沒有任何緩存的理由,這些都不能被控制嗎? – 19greg96

+1

同樣,這一切都發生*你的應用程序外*,所以忽略它。內存不在您的應用程序中分配,它在操作系統本身。線程由操作系統管理,而不是您的應用。不,這些行爲都不能在您的應用內部進行控制。它對您的應用程序透明,由對話框和操作系統在內部使用,作爲私有實現細節。所以就忽略它然後繼續前進。 –

+0

猜猜我可以忍受。但是我仍然有點難以理解它。 – 19greg96