我在使用控件CSTRING变量取得值.传入到线程取值正确
在全局过程里传一个CSTRING变量到线程时取值错误.为什么?我想可能是全局变量执行完成.变量不存在.又如果解些问题吗?
听说可以使用SENDMESSAGE.知道的先能不能简单讲一下.

解决方案 »

  1.   

    **我在使用控件CSTRING变量取得值.传入到线程取值正确**
    只要控件的实例还在,传入线程应该没有问题**在全局过程里传一个CSTRING变量到线程时取值错误.为什么?**
    在过程中定义的CString变量(不是用 new),在出过程后即被释放,线程可能在该过程结束后执行,可能会出错
      

  2.   

    可以把CString的地址作为消息参数传送给线程。据我所知,对线程发送消息只能使用PostThreadMessage(),但是它只是把消息放到线程的消息队列里面,并不等待线程处理完消息,所以不能保证线程根据消息参数取得CString的时候,CString对象还存在。我试着给处一个解决问题的方法,供你参考:#define   WM_PROCESSSTRING   WM_USER + 100 HANDLE hProcessed;  //表示线程已经处理完消息的事件
    HANDLE hExit;       //表示请求线程退出的事件DWORD CALLBACK ThreadProc(LPVOID p)
    {
    MSG  msg;
    CString *pText;

    while (WaitForSingleObject(hExit,100)==WAIT_TIMEOUT)
    {
    if (PeekMessage(&msg,0,WM_PROCESSSTRING,WM_PROCESSSTRING,PM_REMOVE))
    {
    pText = (CString *)msg.lParam;
    MessageBox(NULL,*pText,TEXT("线程取得CString"),MB_OK);
    SetEvent(hProcessed); //表示线程已经处理完消息
    }
    }
    return 0;
    }
    void CstringView::OnBnClickedPostmessage()
    {
    CString str; UpdateData();
    str = m_strText; //取得控件的CString变量 ResetEvent(hProcessed);
    //给线程发消息
    PostThreadMessage(m_dwThreadID,WM_PROCESSSTRING,0,(LPARAM)&str);
    //无限等待线程处理完消息
    WaitForSingleObject(hProcessed,INFINITE);
    }至于启动线程,创建事件,关闭线程句柄和事件句柄的代码就不用我写了吧。
      

  3.   

    PostThreadMessage(m_dwThreadID,WM_PROCESSSTRING,0,(LPARAM)&str);
    向线程发送消息要作一个循环,因为不一定一次能发送成功
    while(!PostThreadMessage(m_dwThreadID,WM_PROCESSSTRING,0,(LPARAM)&str))
    {
      Sleep(10);
    }
      

  4.   

    TO: jdzwq(一技之痒)
    怎样解决呢?线程中过程如何传参数进去呢?
      

  5.   

    typedef struct tagMyParam{
    CSring strVal;
    .../*other struct member*/
    }MyParam;DWORD WINAPI MyThreadProc(LPVOID param)
    {
      MyParam* pmp = (MyParam*)param;
      .../*you codeing using pmp->strVal*/  ...
    }
    /*主线程内把要使用的要用地字符串赋给结构*/
    MyParam *pmp = (MyParam*)calloc(1,sizeof(MyParam));
    pmp->strVal = _T("Hello"); /*you master window handle*/
    .../*创建线程是把参数传进去*/
    DWORD dwid;
    CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MyThreadProc,(void*)pmp,0,&dwid);