最近接触到多线程,想做个程序练习一下,现在碰到一个问题
我创建了一个对话框工程,想让几个线程把当前的运行结果显示在
对话框的文本框中,但我不知道如何在我的线程函数中操作对话框上的控件
我能在线程中对类声名的变量进行操作吗
UINT CMyDlg::WorkThread1(LPVOID wParam) //线程
{
//m_static1.SetWindwosText...
//m_static1是我设给一个控件变量
         //请问在这里为什么不能对它进行操作
return 1;
}

解决方案 »

  1.   

    线程处理一般是设定为全局的UINT WorkThread1(LPVOID wParam)
    建议先仔细看看书
      

  2.   

    应得到对话框的句柄,然后用m_DlgWnd->GetDlgItem(ID_STATIC1)去得到相应控件的名柄!
      

  3.   

    1. 线程一般是全局 例如DWORD WINAPI ClientThread(LPVOID lpParam);
    2. 线程中控制CMyDlg 用AfxGetMainWnd()->m_wnd获得句柄 
              AfxGetMainWnd()->m_wnd->m_static1;
      

  4.   

    我试着将对话框对象的指针作为线程的参数传进去
    在CMyDlg中定义
    struct ParamToThread
    {
             CMyDlg *pInstance;
    int iNum;
    };CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDlg::IDD, pParent)
    {
    ...
    ParamToThread *pParamToThread;
    pParamToThread->pInstance = this;
    pParamToThread->iNum = 0;
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread1, pParamToThread, 0, NULL);
    }
    但我在全局的线程中该怎么获取对话框的指针
    UINT WorkThread1(LPVOID wParam) //工作线程
    {
    int index;
    CMy7Dlg *pDlgInstance;
    //ParamToThread *pParamToThread;
    //pParamToThread = (ParamToThread * )(wParam);
             
             //index = pParamToThread->iNum;
    //pDlgInstance = pParamToThread->pInstance; //delete pParamToThread;
    return 1;
    }
      

  5.   

    将这句
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread1, pParamToThread, 0, NULL);
    改为
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread1, this, 0, NULL);在UINT WorkThread1(LPVOID wParam)中:
    CMy7Dlg *pDlgInstance;
    pDlgInstance = wParam;
    然后就可以使用了
      

  6.   

    谢谢!
    我试了一下,不过pDlgInstance = wParam;这句有报错:
    error C2440: '=' : cannot convert from 'void *' to 'class CMyDlg *'
            Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    不知道是什么原因
      

  7.   

    应该是 pDlgInstance = (CMyDlg*)wParam;调用线程的时候可以直接传this指针的。