在MFC创建的对话框程序中创建了一个线程如下:
void CXXXDlg::OnBnClickedXXX()
{//按键响应函数
DWORD dwThrdParam,dwThreadId;
HANDLE hThread; 
hThread = CreateThread( NULL,0,ThreadFunc,&dwThrdParam,0,&dwThreadId);
}
同时定义函数如下:
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
//这里不能直接调用类CXXXDlg中的成员变量和函数
return TRUE;
}
现在函数ThreadFunc不能直接调用这个程序中的类成员变量和函数了,请问应该怎样做呢
谢谢

解决方案 »

  1.   


    hThread = CreateThread( NULL,0,ThreadFunc,&dwThrdParam,
                            this/* dlg 的this指针*/,
                            &dwThreadId);

    DWORD WINAPI ThreadFunc( LPVOID lpParam )
    {
    CXXXDlg* pDlg = (CXXXDlg*)lpParam;
    pDlg->对话框的函数或者成员。

    }
      

  2.   

    你创建线程写的有问题,MFC中使用AfxBeginThread创建线程,另外,你线程参数传递的是局部变量的地址。现在函数ThreadFunc不能直接调用这个程序中的类成员变量和函数了,请问应该怎样做呢
    -----------------------------------------------------------------------
    你可以能需要重新设计数据结构,可能你设计的不太合理
      

  3.   

    除了2楼的方法,你也可以把线程函数作为对话框类的成员函数,就没限制了。具体请看这里:http://blog.csdn.net/ringphone/archive/2004/09/28/118883.aspx
      

  4.   

    不好意思,复制错地址了,是这个:http://blog.csdn.net/ringphone/archive/2004/10/18/141074.aspx
      

  5.   

    创建线程最好不要使用CreateThread
      

  6.   


    这样做法编译都能不过的,传递参数 this 不正确
      

  7.   

    就是你把能编译通过的函数  倒数第三个 变成 this 传递指针
      

  8.   

    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES lpsa, 
      DWORD cbStack, 
      LPTHREAD_START_ROUTINE lpStartAddr, 
      LPVOID lpvThreadParam, 
      DWORD fdwCreate, 
      LPDWORD lpIDThread
    ); 这个函数的第4个参数lpvThreadParam , 就是传入一个值给线程, 你把dlg的指针放入此参数就可以了。