我想在List control中显示数据,但是调用UpdateData(false)时出现 “试图执行系统不支持的操作”!!!网上有人说:有百分之八十的原因是你使用了一个资源,比如一个EDIT,同时你又在类中建了一个成员,如CEdit  m_editTest;但是现在你把这个EDIT删除了,而m_editTest却没有删除。你只要在ClassWizard中找到这个定义,将其删除就一切OK了。但是我看过了,并不是这种情况啊!!!代码:List control的ID是IDC_ONLINE_LISTvoid CTransfersServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_ONLINE_LIST, m_onlineList);
}//按下按键后启用线程
void CTransfersServerDlg::OnBnClickedStartUp()
{
// TODO: 在此添加控件通知处理程序代码 GetDlgItem(IDC_ONLINE_LIST)->EnableWindow(true);     /////设置列表有效
GetDlgItem(IDC_MSG_TASK)->EnableWindow(true);        /////设置发送消息有效
GetDlgItem(IDC_START_UP)->EnableWindow(false);  //但是,如果我在这里直接调用 ShowList("tim","kdj","tiui")又可以正常显示!!!实在太奇怪了!!!
 //   ShowList("tim","kdj","tiui");
HANDLE threadhandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerStartUp, NULL, NULL, NULL);
CloseHandle(threadhandle);
}
//线程函数
void ServerStartUp()
{
    CTransfersServerDlg obj;
    userNameStr = "tim";
    ipStr = "222.222.222.255";
    portStr = "52643";
//此处调用ShowList();
    obj.ShowList(userNameStr ,ipStr ,portStr);
}void CTransfersServerDlg::ShowList(CString userNameStr ,CString ipStr ,CString portStr)
{
//
int nIndex = 0;  //m_onlineList.GetItemCount();
//LV_ITEM lvitem;
//lvitem.mask = LVIF_TEXT;
//lvitem.iItem = nIndex;
//lvitem.iSubItem = 0;
////CString temp;
////temp.Format('%s\',m_value1);
//lvitem.pszText = (char*)(LPCTSTR)"1";
m_onlineList.InsertItem(nIndex,"1");
m_onlineList.SetItemText(nIndex,1,userNameStr);
m_onlineList.SetItemText(nIndex,2,ipStr);
m_onlineList.SetItemText(nIndex,3,portStr);//问题出在这里了,如果去掉UpdateData(false),程序运行后不会出现“试图执行系统不支持的操作”!!
UpdateData(false);
}
为什么是线程函数中调用本类的函数时会这样呢???
小弟第一次发贴求救,希望高手们帮帮手!!!感谢万分!!!!!

解决方案 »

  1.   

    UpdateData(false);改成GetActiveView()->UpdateData(false);看看。觉得是线程中调用这个函数的问题,,
      

  2.   

    不要在线程中去调用,可以通过在线程中给窗口发送消息  来处理UpdateData(false);
      

  3.   

    1>.\TransfersServerDlg.cpp(257) : error C2227: “->UpdateData”的左边必须指向类/结构/联合/泛型类型
    1>        类型是“'unknown-type'”
    1>.\TransfersServerDlg.cpp(257) : error C3861: “GetActiveView”: 找不到标识符出错啊,是不是要包含一个头文件或者其他???thx!!
      

  4.   

    你这根本乱来
    CTransfersServerDlg obj;
      obj.ShowList(userNameStr ,ipStr ,portStr);
    void CTransfersServerDlg::ShowList(CString userNameStr ,CString ipStr ,CString portStr)
    {
      UpdateData(false);
    }你说这obj什么时候创建的?瞎搞, 你这obj根本没有创建懂吗?对话框没有创建不能UpdateData。CTransfersServerDlg obj;
    obj.Create(CTransfersServerDlg::IDD);//建立对话框,默认为隐藏这样就可以了
      

  5.   

    其实按照你的意思应该把对话框的指针传给ServerStartUp函数,这样就不用创建obj
    你那样做你其实建立两个不相关的对话框
      

  6.   

    HANDLE threadhandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerStartUp, (LPVOID)this, NULL, NULL);
    void ServerStartUp(CTransfersServerDlg *pDlg)
    {
        userNameStr = "tim";
        ipStr = "222.222.222.255";
        portStr = "52643";
    //此处调用ShowList();
        pDlg->ShowList(userNameStr ,ipStr ,portStr);
    }
      

  7.   

    打错了。应该是GetActiveWindow();估计也没有用
    另外,楼主在线程中最好把obj这个对象用this指针的方式传进去
    void CTransfersServerDlg::OnBnClickedStartUp()
    {
      AfxBeginThread(ServerStartUp, this )
    }
    void ServerStartUp(LPVOID pVal)
    {
      CTransfersServerDlg* pDlg=(  CTransfersServerDlg* )pVal;
      pDlg->ShowList(userNameStr ,ipStr ,portStr);
    }这样试试看吧
      

  8.   

    嗯,谢谢你先!!
    调用obj.Create(IDD_TRANSFERSSERVER_DIALOG);后又一次建立了原来的对话框啊!!把对话框的指针传给ServerStartUp函数??
      

  9.   

    问题终于解决啦!!!!
    谢谢feiyangdn和sereve!!!你们都说得对!!!!
    想不到第一次发贴问题就马上解决!!!
    再一次谢谢你们!!!