Re[8]: Основной MDIFrame в отдельном потоке
От: TatarDozor  
Дата: 10.09.08 05:09
Оценка:
Здравствуйте, AstroMan, Вы писали:

AM>LoadFrame в основном зовет Create и посылает WM_INITIALUPDATE дочерним окнам.

AM>Ничего зацепляющего другой фрейм там вроде нет.
AM>Может в коде CPreviewFrame где-то явно зацепляется AfxGetApp()->... (в OnCreate, например).
AM>С моим кодом отличие в том, что я не вызываю LoadFrame, а просто CMDIFrameWnd::Create.

AM>Что в стеке-то при вываливании assert'a? Кто зовет CDocument::AssertValid() и в котором потоке?


Вот Call Stack, все происходит в дополнительном потоке

     znz32_d.exe!CWnd::AssertValid()  Line 892 + 0x43 bytes    C++              //здесь вываливается Assert
     znz32_d.exe!CView::AssertValid()  Line 500    C++                      //
     znz32_d.exe!CZnzView::AssertValid()  Line 795    C++                      //мой пользовательский класс вида используется
                                                                                 //в шаблоне 1, в дополнительном потоке вообще
                                                                                 //надо использовать класс CZnzPreview (вид для шаблона 2)
                                                                                 //который я добавлял к CPreviewApp в InitInstance()
     znz32_d.exe!AfxAssertValidObject(const CObject * pOb=0x0237dc98, const char * lpszFileName=0x010040ec, int nLine=882)  Line 107    C++
     znz32_d.exe!CDocument::AssertValid()  Line 883    C++
     znz32_d.exe!CZnzDoc::AssertValid()  Line 570    C++                      //класс документа
     znz32_d.exe!AfxAssertValidObject(const CObject * pOb=0x02384218, const char * lpszFileName=0x0102d90c, int nLine=423)  Line 107    C++     
     znz32_d.exe!CDocTemplate::AssertValid()  Line 424    C++
     znz32_d.exe!CMultiDocTemplate::AssertValid()  Line 213    C++              //вот он и зовет CDocument::AssertValid(), хотя если логично 
                                                                                 //рассуждать, то не должен, ведь я еще не добавил ни одного документа,
                                                                                 //стало быть эта сволочь обращается к документам которые были открыты
                                                                                 //в основном фрейме, почему?
     znz32_d.exe!AfxAssertValidObject(const CObject * pOb=0x0186cab8, const char * lpszFileName=0x01123c88, int nLine=253)  Line 107    C++
     znz32_d.exe!CBCGKeyboardManager::LoadState()  + 0xd0 bytes    
     znz32_d.exe!CBCGWorkspace::LoadState()  + 0x4de bytes    
     znz32_d.exe!CBCGFrameImpl::OnLoadFrame()  + 0x47 bytes    
     znz32_d.exe!CBCGMDIFrameWnd::LoadFrame()  + 0x5d bytes                     //начало создания фрейма
     znz32_d.exe!CPreviewApp::InitInstance()  Line 50 + 0x1e bytes    C++      
     znz32_d.exe!_AfxThreadEntry(void * pParam=0x0012f034)  Line 113 + 0xd    //запуск потока
     znz32_d.exe!_callthreadstartex()  Line 348 + 0xf bytes    C                //запуск потока
     znz32_d.exe!_threadstartex(void * ptd=0x02b7abb8)  Line 331    C        //запуск потока


Кстати, если запускать Release версию проги, то она создает фрейм, добавляет документ, с ним даже можно поработать немного!!! После нескольких манипуляций
прога зависает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.