_beginthreadex(NULL,0,display,this,0,&hThreadId);
unsigned __stdcall CExcelAccessDlg::display(void *p)
{    CExcelAccessDlg* pDlg = (CExcelAccessDlg*)p;
    pDlg->m_AccessList.AddString(glostring);
    pDlg->m_AccessList.SetCurSel(listid);//--应该显示出来,但是没有,为什么?
    listid=listid+1;
     return true;
}

解决方案 »

  1.   

    listid是什么东西?SetCurSel()的参数是ADDSTRING的顺序(0,1,2,3……),不是ID
      

  2.   

    int listid;一个变量。可以这么写的。我想可能是线程的问题
      

  3.   

    查看一下pDlg->m_AccessList.AddString(glostring);的结果是否成功了
      

  4.   

    调用
    void CExcelAccessDlg::display1()
    {    
           int x = m_AccessList.AddString(glostring);
           m_AccessList.SetCurSel(x)//--执行到这里就可以显示出来,真是太奇怪了。}
      

  5.   

    ::SendMessage(pDlg->m_AccessList.GetSafeHwnd(), LB_ADDSTRING, 0, glostring);
      

  6.   

    怎么会奇怪呢?前面就已经Adddtring了
      

  7.   

    unsigned __stdcall CExcelAccessDlg::display(void *p)
    {    CExcelAccessDlg* pDlg = (CExcelAccessDlg*)p;
        pDlg->m_AccessList.AddString(glostring);
        pDlg->m_AccessList.SetCurSel(listid);//--应该显示出来,但是没有,为什么?
        listid=listid+1;
         return true;
    }
    这个线程函数中你为什么要用pDlg->m_AccessList.SetCurSel(listid);
    这句呢?他有什么用啊,你在向列表添加数据的时候,列表是在不停的刷新的
    你当然看不到了,你只能看到有数据在不停的往里面添!你把这句去掉试试!
      

  8.   

    基本逻辑是这样的:你调用的AddString()最后是变成了发给列表的消息。
    但是在你的线程函数结束前, 它的UI是没有机会来更新的。但当你执行SetCurSel()时, 强制执行了UI更新, 它就会出来了。
      

  9.   

    对,执行SetCurSel()时,强制执行了UI更新,在调用函数void CExcelAccessDlg::display1()时,可以显示出来。但用到线程里就出不来了
      

  10.   

    我跟了一下程序
    unsigned __stdcall CExcelAccessDlg::display(void *p)
    {
      CExcelAccessDlg* pDlg=(CExcelAccessDlg*) p; ASSERT(pDlg != NULL);
    if (pDlg != NULL)
    {  
    int x = pDlg->m_AccessList.AddString(glostring);
    pDlg->m_AccessList.SetCurSel(x);--执行到这,自动跳出本函数了,下次进入也不是从hThread = (HANDLE)_beginthreadex(NULL,0,display,this,0,&hThreadId);进入,而是从另外一个地方进入。???? } return 0;
    }