VC菜瓜一个……
多个基础问题:
我用CreateThread建立了一个线程函数用来循环操作,为了方便操作我用MFC Dialog框架,为了方便我将建立线程,线程执行函数等一系列操作全部放到了了一个类中,名叫CThreadClass。
即我所有的类为CAboutDlg,CMyDialogApp,CMyDialogDlg,和CThreadClass。问题一:此时,我打算在CMyDialogDlg类中建立一个按钮,点下按钮即可执行CThreadClass内的创建线程,线程执行等操作。我在CMyDialogDlg类中定义了一个CThreadClass的对象 test。之后在按钮的响应函数处添加test.StartThread("aaa");//此处为CThreadClass启动线程的函数。如果是这样,我的程序编译通过,但是退出程序时候会报错Debug Assertion Failed!,如果在按钮的响应函数处定义这个test,则没有此问题!为何?问题二(★★首要问题★★):如上所述,我在CThreadClass类中定义了所有的关于线程的函数,但是我需要传递给CMyDialogDlg中的控件变量,即我要让线程运行的结果随时显示在Dialog上,那么我将如何去做?(即线程函数声明为CThreadClass的静态成员函数,我如何处理与CMyDialogDlg之间的实时传递数据?)(如果用到消息,能否写具体些,我已经乱了……)问题三:我使用CreateThread创建线程,线程函数的参数是一个LPVOID lpParam,任意即32位无符号数,那么我如何通过这个传递CString?我尝试创建一个指针传递,但是跟踪结果是错误的!(我现在使用全局变量当参数~)。问题四:看过一段别人写的程序,程序的资源部分用Static充当了一个字符串输出的功能。查看ClassWizard,发现定义了一个CString,可如何定义这个呢?(双击实在是不管用:()以上的问题,我思考了好一阵子,都不知道怎么做,找书也找不到,找不全。还望高人指点一下,能否说的详细一些?奉上我所有的分数,谢谢了!(分数实在已经没了!)

解决方案 »

  1.   

    问题2解答:可以这样获得CMyDialogDlg的指针:                  CWinApp *thisApp;
    thisApp=AfxGetApp();
    CMyDialogDlg *dlgWnd=(CMyDialogDlg *)thisApp->GetMainWnd();
    此时dlgWnd即为CMyDialogDlg的指针.对于问题4 创建线程用的函数是一个CallBack函数,所以他必须是一个静态或全局函数.又: 不建议象你这样创建线程,最好先创建线程对象,再创建线程.(用AfxBeginThread)
      

  2.   

    问题一:没代码,不好说,你跟踪一下你的断言,看看失败原因
    问题二:你把CMyDialogDlg实例的指针当作线程参数传入
    问题三:你把CString实例的地址传进去就行了,只要该实例在生存期内,一般不会出错
    问题四:你改一下相应空间的id,即不用ID_STATIC,然后你就能定义对应该控件的变量了
      

  3.   

    ifromheaven,谢谢你的解答,我在试。不过有一个问题我很费解,就是我们现在都在编辑的是类(譬如用MFC建一个Dialog的EXE),而实际运行的应该是对象,那么Windows是怎么运行这个对象呢?费解,N多书都说了WinMain,但是我这点却死活不明白?zhengstar,谢谢你对问题4的解答,问题4已经解决了,而且问题一似乎是因为一个和控件关联的变量被删除后,再创建这个变量出现的问题。呵呵。
      

  4.   

    另外zhengstar,我传了CString实例的地址过去,可以跟的时候这个地址就偏偏指的不是这个实例的内容……
    CMyDialogDly的实例的指针是指这个么:CMyDialogDlg *pDialog,这个是我的对话框的类啊?能么?(这问题太傻了~呵呵)
    我试试,呵呵。
      

  5.   

    刚刚发现,只要一给添加的Static添加变量就会报错!
      

  6.   

    如果你是在那个对话框的类中开的线程,你可以把this指针传进去
      

  7.   

    关于CString我用的时候就是对的,你肯定写的有问题,你在好好想一下
      

  8.   

    使用消息机制即可,MessagePost
    发送消息,给指定的函数去处理,令这些函数在Dlg类中。