2012-03-20 109 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中完成它们时删除它们。