我在Thread1中建立了一个CEdit对象:class MyClass
{
static CEdit wndEdit; 
}然后在Thread2中使用他:UINT MyThread2(LPVOID lp)
{
MyClass::wndEdit.GetWindowText();
}居然成功了!
但是书上说,一个线程不能使用另一个线程的CWnd,只能使用hwnd然后Attach(),
这是怎么回事?到底一个线程能不能使用另一个线程的窗口指针

解决方案 »

  1.   

    不能访问关于窗口的东西访问,但可以发送消息,例如调用pWnd->GetSafeHwnd()
      

  2.   

    静态变量不是定义在THREAD的私有堆栈上的,所以没有问题
    全局变量也一样
      

  3.   

    静态变量当然可以,其实普通成员变量也可以通过线程参数传递,但是如果是CWnd之类不能保证不出错,推荐传递句柄,然后用Attach()。
      

  4.   

    静态变量当然可以,普通成员变量也可以通过线程消息参数传递。其实指针本身没什么意义,关键是指向的对象是否可用,鉴于MFC的窗口内存管理,我推荐你用句柄安全。
      

  5.   

    书上说的并没有错, 两个线程间的窗口通信要用 SendMessage/PostMessage, 至于你的程序没有出错的原因很简单, GetWindowText() 其实是个简单的封装, 它里面调用的是 SendMessage(hwnd, WM_GETTEXT, ...).