MFC多线程编程的疑问!一般人解答不了!
MFC多线程编程的疑问,请高手解答!!!
在按钮的单击事件的响应函数中启动两个相同的线程,请看如下代码:
void CThreadtestDlg::OnBnClickedButton1()
{
AfxBeginThread(ThreadProc,m_hWnd,0,0,0,NULL); // L0
AfxBeginThread(ThreadProc,m_hWnd,0,0,0,NULL); // L1
TRACE("Main thread pWnd--- %d\n",this);
}
UINT ThreadProc(LPVOID lpParameter)
{
HWND hWnd = (HWND)lpParameter;
CThreadtestDlg* pWnd = (CThreadtestDlg*)(CWnd::FromHandle(hWnd));
TRACE("Work thread pWnd--- %d\n",pWnd);
CString str;
int i = 2000;
while(i) {
str.Format("%d",i);
SetWindowText(hWnd,str);
i--;
}
return 0;
}
第一个问题:
试问,为什么这样会阻塞主线程?
如果 注释掉 L1 只启动一个这样的线程,那么为什么不会阻塞?
第二个问题:
工作者线程中调用 FromHandle, 为什么不能得到和正确的窗口对象地址(TRACE的输出不一样)??
第三个问题:
如果改变行L2为 AfxBeginThread(ThreadProc2,this,0,0,0,NULL),直接传递MFC窗口对象指针,启动一个这样的线程:
UINT ThreadProc2(LPVOID lpParameter)
{
CThreadtestDlg* pWnd = (CThreadtestDlg*)lpParameter;
TRACE("Work thread 2 pWnd--- %d\n",pWnd);
CString str;
int i = 1000;
while(i)
{
str.Format("%d",i);
pWnd->SetWindowText(str);
i--;
}
return 0;
}
很多书上都说:一个线程只能访问它所创建的MFC对象!但这样的程序也能正常运行,为什么?
引MSDN:
To pass these objects from one thread to another, always send them as their native HANDLE type. Passing a C++ wrapper object from one thread to another will often result in unexpected results.
到底怎么样的MFC对象指针不能被在多线程间传递呢?
欢迎各位加入讨论,谢谢!