据书上说,CWnd,CDC,CMenu,CGdiObject及其派生类只能由生成该对象的线程来访问,在线程间传递的时候应该传递句柄,然后用FromHandle来生成自己的对象。
我自己编了个程序(vc6)试了一下,很奇怪并不是这样,清高手指教。我得程序是基于对话框的普通mfc程序,实现对话框的类是CTestThreadDlg,
对话框上我安了两个控件 ,一个编辑框(IDC_EDIT1),一个button(IDC_BUTTON1),
同时在对话框类(CTestThreadDlg)中添加了一个public访问的成员变量m_var,代码如下:
// TestThreadDlg.cpp
...
UINT ThreadFunc(LPVOID p) // 线程函数,p将要接受CTestThreadDlg对象得指针
{
ASSERT(p != NULL);
// ((CEdit *)p)->SetWindowText("lala");
(CTestThreadDlg*)p)->SetDlgItemText(IDC_EDIT1, "HAHA"); // ---(1)
((CTestThreadDlg*)p)->m_var = 8; // --------------------------(2)
return 0;
}
void CTestThreadDlg::OnButton1() // 单击button(IDC_BUTTON1)的响应函数
{
// TODO: Add your control notification handler code here
AfxBeginThread(ThreadFunc, this);
Sleep(100);
int ret = m_var;
}
让我奇怪的是单击button后,编辑框(IDC_EDIT1)马上显示了“HAHA”,同时通过调试也发现了CTestThreadDlg::m_var值变成了8,也就是说,语句(1)、(2)有效,太奇怪了!(本来觉得(1)、(2)不会有效,因为在线程间传递的时候应该传递句柄)不知什么原因?
我自己编了个程序(vc6)试了一下,很奇怪并不是这样,清高手指教。我得程序是基于对话框的普通mfc程序,实现对话框的类是CTestThreadDlg,
对话框上我安了两个控件 ,一个编辑框(IDC_EDIT1),一个button(IDC_BUTTON1),
同时在对话框类(CTestThreadDlg)中添加了一个public访问的成员变量m_var,代码如下:
// TestThreadDlg.cpp
...
UINT ThreadFunc(LPVOID p) // 线程函数,p将要接受CTestThreadDlg对象得指针
{
ASSERT(p != NULL);
// ((CEdit *)p)->SetWindowText("lala");
(CTestThreadDlg*)p)->SetDlgItemText(IDC_EDIT1, "HAHA"); // ---(1)
((CTestThreadDlg*)p)->m_var = 8; // --------------------------(2)
return 0;
}
void CTestThreadDlg::OnButton1() // 单击button(IDC_BUTTON1)的响应函数
{
// TODO: Add your control notification handler code here
AfxBeginThread(ThreadFunc, this);
Sleep(100);
int ret = m_var;
}
让我奇怪的是单击button后,编辑框(IDC_EDIT1)马上显示了“HAHA”,同时通过调试也发现了CTestThreadDlg::m_var值变成了8,也就是说,语句(1)、(2)有效,太奇怪了!(本来觉得(1)、(2)不会有效,因为在线程间传递的时候应该传递句柄)不知什么原因?
解决方案 »
- 这个链接我用http协议发送Request总是返回400,怎么办
- 求URLDownloadToFile下载文件显示进度写法!
- 如何实现界面转换?
- 我以前写的ActiveX控件在ie中使用时,出现对话框,称无法验证开发者,该怎么解决
- 散分了!
- mscomm控件发送数据的一个问题,谢谢
- 关于宏pragma的问题!!!!!!!!
- 100分大奉送!!决不食言!变量转换!
- mfc 鼠标选中内容后如何传递给参数?
- 如何将数据库(Access)中的数据显示在ListCtrl控件中
- 高分请教:怎样在NT和2000的自己创建的桌面上创建一个永远处于最底层的窗口?
- SkinMagic SDK for Vsual C++ Beta0.6发布了!
只是建议在传递MFC对象时,尽量使用HANDLE而已