AfxBeginThread(DownLoadFileThreadProc, GetSafeHwnd(),
THREAD_PRIORITY_NORMAL);
UINT DownLoadFileThreadProc(LPVOID pParam)
{
CWnd *pWnd = AfxGetMainWnd();
ASSERT_KINDOF(CMainFrame, pWnd);
return 0;
}
这样的断言为什么在这里不行?我在一般的成员函数中都是可以,这是为什么?有解决的方法吗?还请大侠指点一二,谢谢!
THREAD_PRIORITY_NORMAL);
UINT DownLoadFileThreadProc(LPVOID pParam)
{
CWnd *pWnd = AfxGetMainWnd();
ASSERT_KINDOF(CMainFrame, pWnd);
return 0;
}
这样的断言为什么在这里不行?我在一般的成员函数中都是可以,这是为什么?有解决的方法吗?还请大侠指点一二,谢谢!
其他的类,函数不行
在你的线程函数中使用
CxxFrame *pWnd =(CxxFrame *)AfxGetMainWnd();
来得到主框架指针就可以了
其他的类,函数不行这种说法我不同意。
mfc在由CObject派生的类中也实现的这种功能
其实 ASSERT_KINDOF()== ASSERT(pobject->IsKindOf(RUNTIME_CLASS(classname)));
ASSERT_KINDOF必须用在由CObject派生的类中
其他的类,函数不行
的说法
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
确定(按钮)
UINT DownLoadFileThreadProc(LPVOID pParam)
{
CWnd *pWnd=0 ;
pWnd=CWnd::FromHandle(pParam);
return 0;
}
查询 ASSERT_KINDOF
那我也建议你重新看一下,顺便学学虚心做人!楼主的问题本身程序代码就有问题,弹出断言是正确的:
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;
}
以后还请多多指教!
关注,我以前在 ISAPI 中也遇到过相似的问题...
下面的代码在别的地方都是可行的.
CWnd *pWnd = AfxGetMainWnd();
ASSERT_KINDOF(CMainFrame, pWnd);
其他的类,函数不行
AfxBeginThread()是再创建一个CWinThread对象,而AfxGetMainWnd()是得到当前的Thread的框架指针,有可能是这里面出了一点问题,有兴趣的话楼主可自己跟一下。