2012-03-20 113 views
1

我嘗試傳遞一個結構作爲參數。AfxBeginThread中的參數結構

全球結構:

struct ThreadParams 
{ 
    HWND window; 
    LIB::ServiceContainer* mrt; 
}; 

在主線程:

ThreadParams threadparams; 
threadparams.window = (HWND) GetSafeHwnd(); 
threadparams.mrt = m_rt; 

CWinThread* pthread1; 
pthread1 = (CWinThread*) AfxBeginThread(Thread1,(LPVOID)&threadparams,THREAD_PRIORITY_NORMAL,0,0,0); 

類外:

UINT Thread1(LPVOID lp) 
{ 
ThreadParams* threadparams = (ThreadParams*) lp; 

    HWND hmainWindow = threadparams->window; 
LIB::ServiceContainer* m_rt = threadparams->mrt; 

} 

雖然它編譯罰款,我會在運行時錯誤(這是一個意外的錯誤),我想我搞砸了指針m_rt。你看到任何明顯的錯誤?

+2

你能展示更多的調用代碼嗎?如果threadparams在線程運行時被破壞,那麼該線程有一個懸掛指針。 – hmjd 2012-03-20 14:52:47

回答

3
ThreadParams threadparams; 

需要注意的是,如果它是一個局部變量,並聲明它創建線程後返回功能,那麼線程是指物體不存在了,因爲局部變量被銷燬時,函數返回。如果是這樣的話,那麼使用new而不是作爲創建新實例:

ThreadParams * pthreadparams = new ThreadParams(); 

並把它傳遞給線程,這樣會存在即使它創建線程返回的功能。當然,當你完成它時,你必須手動刪除它。

2

在大多數情況下,您無法安全地訪問在不同線程中分配的局部變量。到Thread1啓動時,結構可能已經在主線程中超出了範圍。您應該找到另一種方法,例如在主線程中使用new分配參數,並在Thread1中完成它們時刪除它們。