关于启动线程时传输窗口对象(指针?句柄?)的问题。
iq199 2003-09-13 12:28:33 关于启动线程时传输窗口对象(指针?句柄?)的问题:
在选择菜单中的开始线程后:
void CMainFrame::OnMenu_Start()
{
...
AfxBeginThread(MyThread, this);
...
}
线程函数如下:
UINT MyThread(LPVOID pParam)
{
CMainFrame* pMainFrm = (CMainFrame *)pParam;
...
}
问题一:
这样的代码是不是有问题?
(文档中说线程间不能直接传输MFC对象的指针,应该通过传输句柄实现)
问题二:
这样使用开始好像没有问题,直接通过pMainFrm访问窗口中的view都正常。
但发现访问状态条时:
pMainFrm->m_wndStatusBar.SetPaneText(2, "test);
出现Debug Assertion Failed!(在窗口线程中没有问题)
位置是wincore.cpp中的
ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
为什么访问View能正常,但访问状态条时不可以呢?
问题三:
如果通过传输句柄实现,怎样做呢?
我用下面的代码执行时有问题:
void CMainFrame::OnMenu_Start()
{
...
HWND hWnd = GetSafeHwnd();
AfxBeginThread(MyThread, hWnd);
...
}
UINT MyThread(LPVOID pParam)
{
CMainFrame* pMainFrm = (CMainFrame *)(CWnd::FromHandle((HWND)pParam));
...
}
执行时通过线程中得到pMainFrm,访问其成员时不正常。