Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с запуском нескольких копий MFC приложения

318
13 октября 2008 года
nof
193 / / 03.04.2006
Стал получать жалобы от пользователей программы, что они не могут запустить много копий моей программы. Один говорит больше 15 не запускается, второй говорит больше 18-ти.
Я решил на своём компе попробовать, запустилось всего 8 копий программы, девятая не открывается. Только появляется окно, сразу закрывается.

Ну я открыл проект в MSVC (c++, mfc), загружаю в дебаггере, действительно, получаю эксепшен при запуске такого плана:

Цитата:

...............................
'program.exe': Loaded 'D:\WINDOWS\system32\hnetcfg.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\wshtcpip.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
>>> If this dialog has OLE controls:
>>> AfxEnableControlContainer has not been called yet.
>>> You should call it in your app's InitInstance function.
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CInvalidArgException at memory location 0x0012df4c..
Warning: Uncaught exception in WindowProc (returning 0).
'program.exe': Loaded 'D:\WINDOWS\system32\nvwimg.dll', Binary was not built with debug information.
'program.exe': Unloaded 'D:\WINDOWS\system32\nvwimg.dll'
'program.exe': Loaded 'D:\WINDOWS\system32\nvwddi.dll', No symbols loaded.
First-chance exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.
Unhandled exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.



Вставляю AfxEnableControlContainer(0); в Init класса основного диалога, получаю самый натуральный виндовый эксепшен:

Цитата:

.......................................
'program.exe': Loaded 'D:\Program Files\Kaspersky Lab\Kaspersky Anti-Virus 7.0\dnsq.dll', No symbols loaded.
The thread 'Win32 Thread' (0x628) has exited with code 0 (0x0).
'program.exe': Loaded 'D:\WINDOWS\system32\winrnr.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\rasadhlp.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\hnetcfg.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\wshtcpip.dll', No symbols loaded.
Warning: Dialog creation failed! GetLastError returns 0x00000008
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
'program.exe': Unloaded 'D:\WINDOWS\system32\riched32.dll'
'program.exe': Unloaded 'D:\WINDOWS\system32\riched20.dll'
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
'program.exe': Unloaded 'D:\WINDOWS\system32\riched32.dll'
'program.exe': Unloaded 'D:\WINDOWS\system32\riched20.dll'
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
Warning: Dialog creation failed! GetLastError returns 0x00000008
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CInvalidArgException at memory location 0x0012df4c..
Warning: Uncaught exception in WindowProc (returning 0).
First-chance exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.
Unhandled exception at 0x00401310 in program.exe: 0xC0000005: Access violation reading location 0xcccccdcc.
The program '[3768] program.exe: Native' has exited with code 0 (0x0).



Причём не понятно, в каком месте кода возникает эксепшен. Вроде бы при создании таба в одном из диалоговых окон.
Самая странная вещь заключается в том, что если также запускать программу при уже запущенных семи копиях, она запустится без каких-либо проблем... На других компах максимальное количество копий сильно варьируется..

Кто-нибудь сталкивался с такой проблемой? Ума не приложу, в чём дело.

318
15 октября 2008 года
nof
193 / / 03.04.2006
нет идей ни у кого? :(
318
23 октября 2008 года
nof
193 / / 03.04.2006
не спрашивайте как, но понял, что проблема в рич эдитах.
У меня их два в разных диалогах. Оба инициализируются через AfxInitRichEdit(). Я что-то упустил? Что-то ещё надо добавлять?
14
23 октября 2008 года
Phodopus
3.3K / / 19.06.2008
AfxInitRichEdit2() ??
288
23 октября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: nof
не спрашивайте как, но понял, что проблема в рич эдитах.
У меня их два в разных диалогах. Оба инициализируются через AfxInitRichEdit(). Я что-то упустил? Что-то ещё надо добавлять?



И все-таки, как вы поняли, что проблема в RichEdit?

318
24 октября 2008 года
nof
193 / / 03.04.2006
Цитата: nikitozz
И все-таки, как вы поняли, что проблема в RichEdit?


ну ошибка, которую показывает деббагер, указывает на наличие "OLE Controls". У меня вроде только ричэдит подходит под это описание)

562
25 октября 2008 года
tarekon
175 / / 19.08.2003
А если запускаться по отладчиком - ошибка воспроизводится?
Если да - тогда включайте Debug->Exceptions, Break on throw. И смотрите стек вызовов.
318
27 октября 2008 года
nof
193 / / 03.04.2006
Цитата: tarekon
А если запускаться по отладчиком - ошибка воспроизводится?
Если да - тогда включайте Debug->Exceptions, Break on throw. И смотрите стек вызовов.


воспроизводятся, но странные и периодически разные.
Попробовал как вы сказали (в Debug->Exceptions отметил галочками всё, что можно), получил такой output:

Цитата:
............
'program.exe': Loaded 'D:\WINDOWS\system32\winrnr.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\rasadhlp.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\hnetcfg.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\wshtcpip.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched32.dll', No symbols loaded.
'program.exe': Loaded 'D:\WINDOWS\system32\riched20.dll', No symbols loaded.
program.exe has triggered a breakpoint


Останов произошёл вот тут:

 
Код:
pAPage3 = new CAPage3;
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pAPage3;
    m_TabCtrl.SetItem(5, &TabItem);
    VERIFY(pAPage3->Create(CAPage3::IDD, &m_TabCtrl)); <-------------- тут первый останов
    pAPage3->SetWindowPos(NULL, 2, 42, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
    pAPage3->ShowWindow(SW_HIDE); <--- тут происходит следующий бряк, если продолжить выполнение), причём hWnd pAPage3 равно нулю - 0x00000000)

А если ещё дальше продолжить, то получаем вообще невминяемые эксепшены:
Цитата:

program.exe has triggered a breakpoint
Error: no data exchange control with ID 0x03EC.
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CNotSupportedException at memory location 0x0012dcd8..
First-chance exception at 0x7c812aeb in program.exe: Microsoft C++ exception: CInvalidArgException at memory location 0x0012dbe8..



Диалог pAPage3 загружается в таб главного окна. Содержит стандартные кнопочки, галки, переключатели, ну и combobox. Возможно, первоначально проблемы происходят где-то в предыдущих диалогах.

А теперь самое интересное! Как я писал в самом начале, у меня загружается только 5 копий программы. Сейчас я попробовал, то же самое, но при загрузке 6-го он повисает и перестают открываться вообще какие-либо приложения!!! У меня 4-ёх ядерный процессор, 6-ая копия программы занимает 25%. Остальные 75% свободны и при этом даже при попытке открыть диспетчер задач (через alt+ctrl+del) я получаю звук ошибки и он тупо не открывается, пока я не убью одну из пяти запущенных копий программы!!
Далее, у меня было открыто 4 копии QIP с кучей диалогов, я поубивал их и смог запустить 11 копий своей программы :/ Как это так? Может количество загруженных элементов управления в виндах ограничено? Как это проверить? Как в этом убедиться?

562
28 октября 2008 года
tarekon
175 / / 19.08.2003
Чему равен GetLastError() после pAPage3->Create(CAPage3::IDD, &m_TabCtrl)?
318
29 октября 2008 года
nof
193 / / 03.04.2006
Цитата: tarekon
Чему равен GetLastError() после pAPage3->Create(CAPage3::IDD, &m_TabCtrl)?


нулю :/
но дело в том, что в зависимости от количества открытых программ в виндах открываемая программа падает в совершенно разных местах. И бывает, в output логе просматривается с десяток надписей типа:
Cant create dialog. GetLastError() return 0x00000008
Это не цитата, но смысл таков (при этом оперативы программа ест 40мб судя по диспетчеру задач). Итак, моя версия:

У меня программа имеет несколько окон с кучей настроек. Программа написана так, что все окна с настройками всегда открыты (то есть они создаются через Create(), а затем я их уже показываю/прячу через ShowWindow(SW_SHOW/SW_HIDE). Соответственно, когда программа загружена, загружены и 100 галочек/кнопочек, которые расположены в настроках.
Ну и видать в виндах всё-таки есть какой-то ограничитель.. Ведь если запущено предельное число моих программ (это где-то 10), то я не могу запустить вообще ничего. Даже калькулятор или блокнот.

Отсюда вопросы:
1. есть ли всё-таки такой ограничитель на кол-во элементов управления?
2. в данный момент, как я описал выше, я просто прячу ненужные окна. А как мне сделать, чтобы они полностью закрывались и открывались, при этом чтобы не блокировали работу основного окна? Надеюсь, понятно о чём я.

562
29 октября 2008 года
tarekon
175 / / 19.08.2003
Да, в Windows есть ограничение на число хендлов. Несколько десятков тысяч. Чуть поменьше (16,384) можно создать GDI объектов.

Посмотреть утечку хендлов можно через Task Manager. В окне View->Select Columns нужно выбрать USER Objects, Handle Count, GDI Objects. И посмотреть, не ползет ли какое число слишком сильно вверх.

А за постоянно открытые окошки я бы отрывал ручки :mad:. Потому что в итоге получается "ни себе, ни людям". И хорошо, если пользователь поймет, какая из программ пошла в разнос. А то, бывает, обращается за техподдержкой и приходится искать в своей программе несуществующую ошибку...

Окошки надо закрывать (только не функцией CloseWindow!). Есть функция DestroyWindow.
Можно также открывать их как диалоги. Тогда часть задач по созданию и удалению контролов возьмет на себя ОС.
318
30 октября 2008 года
nof
193 / / 03.04.2006
Цитата: tarekon
Да, в Windows есть ограничение на число хендлов. Несколько десятков тысяч. Чуть поменьше (16,384) можно создать GDI объектов.

Посмотреть утечку хендлов можно через Task Manager. В окне View->Select Columns нужно выбрать USER Objects, Handle Count, GDI Objects. И посмотреть, не ползет ли какое число слишком сильно вверх.

А за постоянно открытые окошки я бы отрывал ручки :mad:. Потому что в итоге получается "ни себе, ни людям". И хорошо, если пользователь поймет, какая из программ пошла в разнос. А то, бывает, обращается за техподдержкой и приходится искать в своей программе несуществующую ошибку...

Окошки надо закрывать (только не функцией CloseWindow!). Есть функция DestroyWindow.
Можно также открывать их как диалоги. Тогда часть задач по созданию и удалению контролов возьмет на себя ОС.


скриншот прикрепил. Процессы с закрытым названием - моя программа. Видно, что User objects имеет больше всех остальных процессов. То есть, действительно проблема в этом? Но ведь значения на вид не так критичны..

Получается, что чтобы побороть проблему, надо уничтожать окна и при требовании пользователя их заново инициализировать?

8.4K
30 октября 2008 года
z0rch
275 / / 02.09.2008
Цитата: nof

...Ну и видать в виндах всё-таки есть какой-то ограничитель.. Ведь если запущено предельное число моих программ (это где-то 10), то я не могу запустить вообще ничего. Даже калькулятор или блокнот....
... есть ли всё-таки такой ограничитель на кол-во элементов управления?



Да, есть.
Возможно Вам поможет это

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог