Автор
|
Тема: delete pDialog; --- EXCEPTION
|
server_mouse |
опубликован 02-10-2001 12:00 MSK
Hi ALL!Делаю примерно так: CMyDialog* pDialog=new CMyDialog; pDialog->Create(IDD_MESAGE); //Тут всякий код ....... //А теперь мне надобно убить диалоговое окно if(pDialog!=NULL) { SendMessage(pDialog->m_hWnd,WM_QUIT,0,0); delete pDialog; } И вот в ответ на delete получаю exception. Из отладки вижу что указатель правильный. Как его правильно удалить?
|
Kostik
|
опубликован 02-10-2001 13:40 MSK
??? Зачем CMyDialog* pDialog = new CMyDialog;Объяви экземпляр класса : CMyDialog m_wndMyDlg; m_wndMyDlg.Create(CMyDialog::IDD); И нигде delete делать не надо. |
migel
|
опубликован 02-10-2001 15:14 MSK
зачем WM_QUIT? DestroyWindow надо юзать |
server_mouse
|
опубликован 02-10-2001 17:44 MSK
>Зачем CMyDialog* pDialog = new CMyDialog; Диалог немодальный, используется долго. Если я выйду из тела ф-ции он умрёт. Нельзя.Если не ошибаюсь (я не уверен) так как предлагает Kostik вообще работать не будет. Ведь нужно зациклить обработчик событий, а винда не даст получить какое-то событие пока не обработано текущее. В то же время выход из ф-ции убьёт окно. DoModal спасает, но мне нужно немодальное окно. Ну да ладно, я уже понял причину. Нельзя удалить MFC класс из другого потока. Сколько раз сталкивался с НЕмногопоточностью MFC....
|
gecky
|
опубликован 02-10-2001 19:23 MSK
А объявить диалог как переменную класса не подходит? В Init() m_dialog.Create(...)
|
server_mouse
|
опубликован 03-10-2001 10:04 MSK
>А объявить диалог как переменную класса не подходит? Класс работает с сокетами и окно нужно лишь по приходу некоторого (довольно редкого) сообщения. Если я создам класс как переменную он ведь будет постоянно висеть в памяти, не так ли? Пользователь может проработать целый день не используя это окно. Получается безполезный расход памяти. Я понимаю что память сейчас дешевле краденого, но всё же... :) Спасибо всем. Всё стало понятно. Нельзя делать delete из другого потока. |
Kostik
|
опубликован 03-10-2001 10:36 MSK
Всё равно. Это конечно моё сугубо индивидуальное мнение, но ведь можно экземпляр диалога объявить в MainFrm.h как public, а Create() диалогу сделать в CMainFrame::OnCreate(). И я так понимаю, что до класса CMainFrame можно из любого места достучаться а значит и до твоего немодального диалога тоже.((CMainFrame *)AfxGetMainWnd())->m_wndMyDlg; Это правда работает только в главном потоке. Если ты так сделаешь в другом потоке то получишь Exeption. Но и это легко решается. Ну ладно. Пиши как знаешь. Это всего лишь один из стилей программирования. |
gecky
|
опубликован 04-10-2001 00:54 MSK
>Получается безполезный расход памяти.Ну я попробовал CTest6Dlg::CTest6Dlg() { m_pDlg1 = NULL; } void CTest6Dlg::OnCreate() { if(m_pDlg1) return; m_pDlg1 = new CDialog1; m_pDlg1->Create(IDD_DIALOG1, this); m_pDlg1->ShowWindow(SW_SHOW); } void CTest6Dlg::OnDelete() { if(!m_pDlg1) return; m_pDlg1->DestroyWindow(); delete m_pDlg1; m_pDlg1 = NULL; } Диалог маленький, но и памяти при создании выделяется 30 кб. Но самое интересное: после первого жмака на кнопку OnCreate жмак на OnDelete эти 30 кб не возвращет (Task Manager). А OnCreate не занимает. Не понял почему. Может выспаться надо конечно, но... Всего 6 строк. |