AfxBeginThread(DownLoadFileThreadProc, GetSafeHwnd(),
               THREAD_PRIORITY_NORMAL);

UINT DownLoadFileThreadProc(LPVOID pParam)
{
    CWnd *pWnd = AfxGetMainWnd();
    ASSERT_KINDOF(CMainFrame, pWnd);
    return 0;
}
这样的断言为什么在这里不行?我在一般的成员函数中都是可以,这是为什么?有解决的方法吗?还请大侠指点一二,谢谢!

解决方案 »

  1.   

    ASSERT_KINDOF必须用在由CObject派生的类中
    其他的类,函数不行
      

  2.   

    那我在这个全局函数想调用CMainFrame的成员该怎么办?怎么才能在全局函数中得到主框架窗口的指针呢?
      

  3.   

    LPVOID pParam // <-- 用这个
      

  4.   

    假如你的主框架类是CxxFrame
    在你的线程函数中使用
    CxxFrame *pWnd =(CxxFrame *)AfxGetMainWnd();
    来得到主框架指针就可以了
      

  5.   

    也可以用线程函数的参数pParam传进去
      

  6.   

    奇怪,不清楚为什么。不过ASSERT_KINDOF必须用在由CObject派生的类中
    其他的类,函数不行这种说法我不同意。
      

  7.   

    运行时类型识别(RTTF)听说过吧!
    mfc在由CObject派生的类中也实现的这种功能
    其实 ASSERT_KINDOF()== ASSERT(pobject->IsKindOf(RUNTIME_CLASS(classname)));
      

  8.   

    笔误!更正上述RTTF应为RTTI,不好意思
      

  9.   

    提示错误是什么呢?是不是你忘了包含头文件呢?我也不同意
     ASSERT_KINDOF必须用在由CObject派生的类中
     其他的类,函数不行
    的说法
      

  10.   

    AfxBeginThread(DownLoadFileThreadProc, GetSafeHwnd(),
                   THREAD_PRIORITY_NORMAL);

    UINT DownLoadFileThreadProc(LPVOID pParam)
    {
        CWnd *pWnd = AfxGetMainWnd();
        ASSERT_KINDOF(CMainFrame, pWnd);
        return 0;
    }调试出现一个对话框
    Debug Assertion Failed!Program: F:\.......\Debug\MyFtp1.exe
    File:  F:\.....serverview.cpp
    Line:    283For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.(Press Retry to debug the application)终止(A)  重试(R)  忽略(I)
    按下终止后又会弹出一个对话框
    User breakpoing called from code at 0x77f7f570
                    确定(按钮)
      

  11.   


    UINT DownLoadFileThreadProc(LPVOID pParam)
    {
        CWnd *pWnd=0 ;
        pWnd=CWnd::FromHandle(pParam);
        return 0;
    }
      

  12.   

    AfxGetMainWnd 取得的是当前 CWinThread 的 m_pMainWnd 成员,只有在主线程内取得的才是 CMainFrame 指针。建议用 AfxGetApp()->m_pMainWnd 代替。
      

  13.   

    to zx_sanjin(1.5kg) 建议你看看msdn
    查询 ASSERT_KINDOF
      

  14.   

    To jruv(江城飞鸿) :
    那我也建议你重新看一下,顺便学学虚心做人!楼主的问题本身程序代码就有问题,弹出断言是正确的:
    CWnd *pWnd = AfxGetMainWnd();
    ASSERT_KINDOF(CMainFrame, pWnd);ASSERT_KINDOF( classname, pobject )的作用是判断pobject类是否是classname或从classname派生下来的,楼主的断言pWnd是CWnd,而CMainFrame是从CWnd派生下来的,所以当然会出现断言报错!一个正统的做法:void CMainFrame::OnThreadCreate() 
    {
    ::AfxBeginThread(ThreadTest, this, NULL);
    }UINT ThreadTest(LPVOID pParam)
    {
    CMainFrame *pFrame = (CMainFrame *)pParam;
    ASSERT_KINDOF(CMainFrame, pFrame); return 0;
    }
      

  15.   

    不好意思,是我看错了,向 zx_sanjin(1.5kg) 道歉!
    以后还请多多指教!
      

  16.   


    关注,我以前在 ISAPI 中也遇到过相似的问题...
      

  17.   

    zx_sanjin(1.5kg):
    下面的代码在别的地方都是可行的.
    CWnd *pWnd = AfxGetMainWnd();
    ASSERT_KINDOF(CMainFrame, pWnd);
      

  18.   

    ASSERT_KINDOF必须用在由CObject派生的类中
    其他的类,函数不行
      

  19.   

    如果你是标准的写法就不会报错的,不是吗?:) 既然用人家的东西就要按人家的章程来办事,要注意代码的标准化。不知大家发现没有,如果我是用_beginthread()来创建的线程函数里如上方法的使用就不会报错,我想这应该是MFC的bug吧:
    AfxBeginThread()是再创建一个CWinThread对象,而AfxGetMainWnd()是得到当前的Thread的框架指针,有可能是这里面出了一点问题,有兴趣的话楼主可自己跟一下。