我在子线程中需对主窗体的控件做操作
代码简写如下:
void MyDlg::OnBnClickedButton1()
{
    .......
   ThreadHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,
                       NULL,0,&thread_ID);
}
static void MyThreadProc(void)
{
   m_CEdit.SetWindowText("....")
   //原意是m_CEdit是主窗体的文本控件,子线程对它做操作
}编译错误,貌似是MyThreadProc是静态,不识别我主窗体控件
想请各位解决完成此功能,最好有简单实例,先谢谢了

解决方案 »

  1.   

    MyThreadProc做成MyDlg类的static成员函数CreateThread的时候,把MyDlg类的this指针传递进去然后在MyThreadProc获得这个对话框的指针,这样就能对m_CEdit进行操作了
      

  2.   

    ThreadHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,
                           this,0,&thread_ID);
    static void MyDlg::MyThreadProc(LPVOID param)
    {
       MyDlg * p = (MyDlg *)param;
       p->m_CEdit.SetWindowText("....")
      
    }
      

  3.   

    需要通过CreateThread的第四个参数LPVOID lpParameter传递指针
    void MyDlg::OnBnClickedButton1()
    {
        .......
       ThreadHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,
                           this,0,&thread_ID);
    }
    DWORD WINAPI MyThreadProc(LPVOID lpParameter)
    {
       CMyDlg *dlg = (CMyDlg *)lpParameter;
       dlg->m_CEdit.SetWindowText("....");
       return 0;
    }
      

  4.   

    dlg->m_CEdit.SetWindowText("....");
    不要这样!
    MFC的CWnd类不是线程安全的,源于TLS的MAP。
      

  5.   

    不是不能直接用控件,你在线程中引用的控件是属于对话框的,线程中不可识别.
    若要使用,则通过对话框的指针来引用,而这个对话框的指针则通过createThread函数传递到线程中.具体实现代码楼上各位已提供了.贴一段如下
    ThreadHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,
                           this,0,&thread_ID);
    static void MyDlg::MyThreadProc(LPVOID param)
    {
       MyDlg * p = (MyDlg *)param;
       p->m_CEdit.SetWindowText("....")
      
    }