typedef struct StrcForThread2Tag
{
HWND mydlg; 
} StrcForThread;StrcForThread strc_thread;  //全局变量void CabcDlg::OnBnClickedStart()
{
HWND mydlg;  
mydlg = this->GetSafeHwnd(); char *cc  = new char[];;
CEdit *m_edit1 = (CEdit *)GetDlgItem(IDC_FRAME_FROM);
        m_edit1->GetLine(0,cc);   //这里可以读到cc strc_thread.mydlg = mydlg;
testThread = AfxBeginThread(testThread, &strc_thread);
}UINT testThread (LPVOID pParam)
{
        StrcForThread* threadInfo = (StrcForThread*)pParam;
char *cc;
CEdit *m_edit1 = (CEdit *)GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM);
cc = new char[m_edit1->LineLength(m_edit1->LineIndex(0))];
m_edit1->GetLine(0,cc);   //这里读不到cc
}虽然读不到cc,但是线程函数里的mydlg和CabcDlg::OnBnClickedStart里用mydlg = this->GetSafeHwnd();得到的是一样的. 现在我只能直接在OnBnClickedStart里找到m_edit1的句柄,传过去,这样是可以的。。

解决方案 »

  1.   

    truct StrcForThread2Tag
    {
      CabcDlg *m_pDlg;
    }StrcForThread;AfxBeginThread(testThread, this);
      

  2.   

    不行啊,this的值已经确实传过去了,但还是读不出m_edit1的句柄,或者说读到了一个地址(0x00190ae2),但这个地址和OnBnClickedStart里读到的不一样
      

  3.   

    试了以下,这样做可以读出来。m_edit1->GetLine(0,cc, m_edit1->LineLength(m_edit1->LineIndex(0)));
      

  4.   

    忘说了,传this。
    typedef struct StrcForThread2Tag
    {
    CtestDlgDlg *mydlg;  
    } StrcForThread;StrcForThread strc_thread; //全局变量UINT testThread (LPVOID pParam)
    {
    StrcForThread* threadInfo = (StrcForThread*)pParam;
    char *cc;
    CEdit *m_edit1 = (CEdit*)threadInfo->mydlg->GetDlgItem ( IDC_FRAME_FROM ) ;
    cc = new char[m_edit1->LineLength(m_edit1->LineIndex(0))];
    int len = m_edit1->GetLine(0,cc, m_edit1->LineLength(m_edit1->LineIndex(0))); //这里读不到cc
    return 0 ;
    }HWND mydlg;   
    mydlg = this->GetSafeHwnd(); char *cc = new char[];;
    CEdit *m_edit1 = (CEdit *)GetDlgItem(IDC_FRAME_FROM);
    m_edit1->GetLine(0,cc); //这里可以读到cc strc_thread.mydlg = this;
    AfxBeginThread(testThread, &strc_thread);
      

  5.   

    不会意思,我刚才说错了,就算我把控件m_edit1的指针直接传过去,也是读不到编辑框的内容的
    void CabcDlg::OnBnClickedStart()
    {
    HWND mydlg;  
    mydlg = this->GetSafeHwnd();
    strc_thread_group.mydlg = mydlg;
    strc_thread_group.m_edit2 = m_edit2;
    groupingThread = AfxBeginThread(FaceGrouping, &strc_thread_group);
    }UINT FaceGrouping(LPVOID pParam)
    {
    StrcForThreadGroup* threadInfo = (StrcForThreadGroup*)pParam;
    char *cc = new char[];
    CEdit *m_edit1 = (CEdit *)CFaceAPIDlg::FromHandle(::GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM));
    m_edit1->GetLine(0,cc); CEdit *m_edit2 = threadInfo->m_edit2;
    char *cc1 = new char[];
    m_edit2->GetLine(0,cc1);
    }我刚才把指针和句柄的概念弄混了,不过现在m_edit1和m_edit2的句柄是一样的了(但是指向的地址不同),但两个都无法读到编辑框...
      

  6.   

    我用XP SP2, VC2005试验可以,你的环境?
      

  7.   

    谢谢dengzikun,成功了,所以问题的关键是传this,然后用CWnd::GetDlgItem(in nID);才能读,那么为什么用::GetDlgItem(HWND m_hwnd, in nID)就始终不行呢?
      

  8.   


    CEdit edit;
    edit.Attach(GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM));
    edit.GetLine(XXXX);
    edit.Detach();
      

  9.   

    LS的也是对的,看来关键还是我GetLine用错了.
    还是要m_edit1->GetLine(0,cc, m_edit1->LineLength(m_edit1->LineIndex(0)));才行,为什么这里就要指定第三个参数,OnBnClickedStart里就不用指定呢?
      

  10.   

    我倒是很奇怪,你这个程序运行起来没问题?CEdit *m_edit1 = (CEdit *)GetDlgItem(threadInfo->mydlg,IDC_FRAME_FROM);此时的 GetDlgItem 是Win32 API ,返回的应该是句柄啊。
    (虽然我见过 HWND 与 CWnd* 之间是可以转换的:物理存储的第一个成员就是m_hWnd, 所以可以转换---个人发现。有不准请指正。)所以家下来你应该用 Win32 API来继续操作,除非你 创建一个CWnd类的派生类的对象,然后把那个句柄
    attach上,再用那个窗口类对象(or 指针)操作(该指针,指的是对应窗口等UI元素的某操作类的对象的指针,而不是这个控件所对应的 窗口对象(表述这个窗口的数据结构)的指针, 该指针由hWnd索引到)
      

  11.   


    从两个函数的定义看,三个参数的函数安全性应该更好一些。MFC中,两个函数最终都是调用SendMessage获取字符串。在消息处理线程中,SendMessage直接调用窗口过程,在工作线程中,SendMessage要跨线程,这需要其他的一些处理。我想问题也许是SendMessage直接调用窗口过程对参数要求不是十分严格,跨线程时对参数要求更严格。具体可以跟踪一下,两个函数在MFC中稍有区别,也就是传入的缓冲区的前两个字节的值不同
      

  12.   

    对的,::GetDlgItem 返回的是句柄,所以要用attach或者FromHandle得到指针
    而CWnd::GetDlgItem就不需要了,直接强制转换...
      

  13.   

    To dengzikun兄:
    之所以没在主线程里处理消息是因为我考虑如果有不同的线程函数是不是每个线程函数都要定义一个结构来传不同的参数,这样似乎太累赘,所以我想所有线程只需要接受主对话框指针就完了。不过问题还没解决现在很奇怪的是用
    CString cc;
    edit.GetLine(0,cc.GetBuffer(), edit.LineLength(edit.LineIndex(0)));
    当编辑框里输入多个字符时可以读出,而只有一个字符时就只能读出这个字符来:
      

  14.   


    edit.GetLine(0,cc.GetBuffer(), edit.LineLength(edit.LineIndex(0))+1);
      

  15.   

    多个也需要+1,你仔细看看MSDN上的说明吧。
    你的问题到哪,我就到MSDN上查到哪,然后试验一下,没时间细看。
      

  16.   

    多谢了, 我的MSDN不知道为什么用不了了,看来还是得装起来啊