一个很简单的对话框程序,内有一个ClistCtrl控件:
头文件内定义:
class CUMS1Dlg : public CDialog
{
// Construction
public:
CUMS1Dlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(CUMS1Dlg)
enum { IDD = IDD_UMS1_DIALOG };
CListCtrl  m_list;但问题是我必须自己定义一个函数:
void yyy();
在这个函数内要修改、添加、删除m_list内的表项;
我是这样操作的:
CUMS1Dlg *dlg=new CUMS1Dlg;
dlg->m_list.InsertItem(0,"第一项");
delete dlg;
.......
而且yyy();还是一个线程函数,需要用创建线程的函数为它创建线程来运行。
问题在于:
如果我将yyy()定义为CUMS1Dlg的类函数,那么线程函数就无法为yyy()创建线程,编译错误。
但是我不将yyy()定义为CUMS1Dlg的类函数,那么编译通过,但运行时一到
dlg->m_list.InsertItem(0,"第一项");就非法操作。
弄了一天,也没搞好到底是怎么弄的,希望高手详细指教!谢谢!谢谢!

解决方案 »

  1.   

    不将yyy()定义为CUMS1Dlg的类函数和dlg->m_list.InsertItem(0,"第一项");就非法操作好象没直接关系啊!
    最好把代码贴全了.
    gz
      

  2.   

    参考这里的在线程中控制进度条的例子
    http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=435
      

  3.   

    还没有create,
    m_list都没有,要出错..CUMS1Dlg *dlg=new CUMS1Dlg;
      dlg->Create(IDD_DIALOG_); //对话框资源iD
    dlg->ShowWindow(SW_SHOW);dlg->m_list.InsertItem(0,"第一项");
    delete dlg;
      

  4.   

    把m_list.InsertItem(0,"未知");改为:
    ((CUMS1Dlg *)(AfxGetApp()->m_pMainWnd))->m_list.InsertItem(0,"未知");
    试试看
      

  5.   

    1.如果把线程函数定义在类内,是不是要加static
    2.看你的代码
    CUMS1Dlg *dlg=new CUMS1Dlg;
    dlg->m_list.InsertItem(0,"第一项");
    delete dlg;在函数内动态生成了一个对话框对象,这个对象并不是你原来的那个对话框,如果操作原来对话框中的listctrl,应该把对话框指针或者引用传进来你在执行到dlg->m_list.InsertItem(0,"第一项");错误,我觉得在new 后应该只是创建了对话框对象的内存空间,并调用了构造函数,但是实际上对话框并没有创建出来。当你执行dlg->DoModel后对话框才创建出来,才创建出对话框,你才可以向listctrl 后添加东西
      

  6.   

    没看清楚.同意楼上.线程函数只能是全局函数或类的static成员函数,
    按你的描述, 需要将你的类对象指针传入线程函数,此时就不能用new和create了, 用new则创建了一个新的对象,就
    不是你原来的对象了.例:
    m_pThread = AfxBeginThread(ThreadProc, this, //this将类对象做参数传入
                       THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);UINT ThreadProc(LPVOID pParam)

        AFX_MANAGE_STATE(AfxGetStaticModuleState()); //需加上 CYourDlg *pDlg = (CYourDlg *)pParam;  //对到对象
            dlg->m_list.InsertItem(0,"第一项");
    '''''
    }
      

  7.   

    搞错 了,这句不要,,是在dll里用的.. 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); //需加上