Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2009, 00:50   #1
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию Постепенное затормаживание открытия диалога

У меня есть приложение с использованием MFC. Там есть главный диалог, на котором находится список с некоторыми элементами. Можно открыть другой диалог для редактирования параметров выделенного элемента списка.

Так вот, наблюдается такая картина. Сначала этот диалог открывается довольно шустро. Но по мере работы, когда он открывается по 20, 30, 40 и больше раз, с каждым разом открытие происходит на долю секунды дольше. Если долго работать, тормоза становятся очень явными.

Кто-нибудь знает, что это может быть?

Код там вроде обычный, что-то вроде:

CDialogProperties dlg;
dlg.DoModal();

В самом диалоге CDialogProperties на первый взгляд тоже ничего криминального нет.
Pashan вне форума Ответить с цитированием
Старый 04.11.2009, 18:40   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Так может кода покажите или проектик дайте посмотреть... Может кто и поможет
counter вне форума Ответить с цитированием
Старый 04.11.2009, 18:48   #3
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Да там проект здоровый, весь выкладывать не хочу. А код... даже не знаю, что там может быть интересного. Ну по теме может быть актуально:

При двойном клике по элементу списка вызывается:

Код:
void CDialogMain::OnEditCard()
{
	int Index = m_LBCards.GetCurSel();
	if (Index < 0 || Index >= m_LBCards.GetCount())
		return;
	CMtgCard* currentCard = (CMtgCard*)m_LBCards.GetItemData(Index);
	ASSERT(currentCard != NULL);
	CDialogCardProperties dlg;
	if (dlg.EditCard(*currentCard))
	{
		currentCard->Assign(*dlg.Card);

		m_LBCards.DeleteString(Index);
		m_LBCards.InsertString(Index, currentCard->Name);
		m_LBCards.SetItemDataPtr(Index, currentCard);
		m_LBCards.SetCurSel(Index);
		OnSelectCard();
		Modified = true;
	}
	m_LBCards.SetFocus();
}
CDialogCardProperties - тот самый диалог свойств. Метод EditCard() по сути то же, что и DoModal():

Код:
bool CDialogCardProperties::EditCard(const CMtgCard& card)
{
	m_Card->Assign(card);
	return (DoModal() == IDOK);
}
Единственное, что еще может быть интересно, это то что в диалоге на OnInitDialog создаются его органы (по определенным соображениям). Не знаю, может ли это как-то влиять.
Pashan вне форума Ответить с цитированием
Старый 04.11.2009, 19:23   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Единственное, что еще может быть интересно, это то что в диалоге на OnInitDialog создаются его органы (по определенным соображениям). Не знаю, может ли это как-то влиять.
элементы создаются динамически?
возможно где-то идет утечка
counter вне форума Ответить с цитированием
Старый 04.11.2009, 20:06   #5
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Элементы объявлены статически как члены класса CDialogCardProperties. В OnInitDialog им делается Create(...). По идее, при разрушении окна все должно само освобождаться.
Pashan вне форума Ответить с цитированием
Старый 04.11.2009, 22:33   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

если честно, то мыслей нет

а что происходит тут m_Card->Assign(card); ?
counter вне форума Ответить с цитированием
Старый 04.11.2009, 22:40   #7
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Вот у меня тоже мыслей нет

В m_Card->Assign(card) тупо копирование значений членов одного объекта в другой. Типо оператора присваивания. К тому же подобные конструкции не только здесь используются и вроде проблем нет.
Главное, если даже где-то есть утечки памяти, это не должно так критично влиять на работу. Памяти в системе хватает, а вот диалог тормозит... Скорее всего что-то другое, виндузовское.
Pashan вне форума Ответить с цитированием
Старый 04.11.2009, 22:57   #8
xxxNeXxxx
Пользователь
 
Регистрация: 18.10.2009
Сообщений: 18
Радость

я не сильно шарю ^_^ но походу оно проверяет списки открытий придедущих окон смотрит нет ли совпадений а потом открывает новое
^_^ както так идея спонтаная может оно и не так работает
xxxNeXxxx вне форума Ответить с цитированием
Старый 04.11.2009, 23:04   #9
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

тормозит только этот диалог или другие тоже (если они есть)?
строки кода коментировать пробовал? эффект тот же?
counter вне форума Ответить с цитированием
Старый 04.11.2009, 23:09   #10
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Про другие сложно сказать, они менее навороченные и реже используются. Так на вскидку не замечал.
Строки комментировать не пробовал, но, видимо, придется. Проблема в том, что там много органов и если их не создавать или еще что-то не делать, то все падать начнет. Очень не хотелось половину кода комментировать. Еще можно попробовать таймеры навставлять, поймать где тормозит...
Pashan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка из-за открытия диалога Marisha* Общие вопросы Delphi 8 12.07.2009 16:15
Зависание при показе Диалога nusik Общие вопросы C/C++ 11 02.07.2009 08:20
Создание диалога из длл Oburec Общие вопросы C/C++ 0 27.06.2009 15:29
Фон диалога - картинка. MFC + dll ACE Valery Visual C++ 2 23.06.2009 23:22
Модуль диалога выбора папки на WinAPI Veress Помощь студентам 0 13.06.2009 23:31