WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  delete pDialog; --- EXCEPTION

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   delete pDialog; --- EXCEPTION
server_mouse опубликован 02-10-2001 12:00 MSK   Click Here to See the Profile for server_mouse   Click Here to Email server_mouse  
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     Click Here to See the Profile for Kostik  Click Here to Email Kostik     
???
Зачем CMyDialog* pDialog = new CMyDialog;

Объяви экземпляр класса : CMyDialog m_wndMyDlg;

m_wndMyDlg.Create(CMyDialog::IDD);

И нигде delete делать не надо.

migel опубликован 02-10-2001 15:14 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
зачем WM_QUIT?
DestroyWindow надо юзать
server_mouse опубликован 02-10-2001 17:44 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
>Зачем CMyDialog* pDialog = new CMyDialog;
Диалог немодальный, используется долго. Если я выйду из тела ф-ции он умрёт. Нельзя.

Если не ошибаюсь (я не уверен) так как предлагает Kostik вообще работать не будет. Ведь нужно зациклить обработчик событий, а винда не даст получить какое-то событие пока не обработано текущее. В то же время выход из ф-ции убьёт окно. DoModal спасает, но мне нужно немодальное окно.

Ну да ладно, я уже понял причину. Нельзя удалить MFC класс из другого потока. Сколько раз сталкивался с НЕмногопоточностью MFC....

gecky опубликован 02-10-2001 19:23 MSK     Click Here to See the Profile for gecky  Click Here to Email gecky     

А объявить диалог как переменную класса не подходит? В Init() m_dialog.Create(...)
server_mouse опубликован 03-10-2001 10:04 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
>А объявить диалог как переменную класса не подходит?

Класс работает с сокетами и окно нужно лишь по приходу некоторого (довольно редкого) сообщения. Если я создам класс как переменную он ведь будет постоянно висеть в памяти, не так ли? Пользователь может проработать целый день не используя это окно. Получается безполезный расход памяти. Я понимаю что память сейчас дешевле краденого, но всё же... :)

Спасибо всем. Всё стало понятно. Нельзя делать delete из другого потока.

Kostik опубликован 03-10-2001 10:36 MSK     Click Here to See the Profile for Kostik  Click Here to Email Kostik     
Всё равно. Это конечно моё сугубо индивидуальное мнение, но ведь можно экземпляр диалога объявить в MainFrm.h как public, а Create() диалогу сделать в CMainFrame::OnCreate().
И я так понимаю, что до класса CMainFrame можно из любого места достучаться а значит и до твоего немодального диалога тоже.

((CMainFrame *)AfxGetMainWnd())->m_wndMyDlg;
Это правда работает только в главном потоке.
Если ты так сделаешь в другом потоке то получишь Exeption. Но и это легко решается.

Ну ладно. Пиши как знаешь. Это всего лишь один из стилей программирования.

gecky опубликован 04-10-2001 00:54 MSK     Click Here to See the Profile for gecky  Click Here to Email gecky     
>Получается безполезный расход памяти.

Ну я попробовал

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 строк.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.