Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 2350 - Компас: Некорректная работа при количестве открытых документов более одного   Make a simular bug
Summary: Компас: Некорректная работа при количестве открытых документов более одного
Status: CLOSED FIXED
Alias: None
Product: КОМПАС 3D
Classification: Поддержка проектов
Component: Тестирование (show other bugs)
Version: v10
Hardware: PC All
: P2 critical
Target Milestone: ---
Assignee: Илья Шпигорь
QA Contact: Денис Баранов
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 753
  Show dependency treegraph
 
In work:
Reported: 2008-09-01 12:02 MSD by Виталий Булгаков
Modified: 2024-03-04 14:58 MSK (History)
6 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Виталий Булгаков 2008-09-01 12:02:41 MSD
1. Запустить КОМПАС
2. Файл - Создать - Чертеж - Ок.
3. Повторить шаг 2.
4. Раскрыть меню, например, Файл. Затем, кликнуть в области документа
Меню свернется, но его часть останется неперерисованной поверх инструментальных панелей
5. Сервис - Параметры.
Ожидаемый результат: поднимается диалог Параметры
Фактически: Компас зависает
Comment 1 Илья Шпигорь 2008-09-11 15:00:17 MSD
Ошибка наблюдается в случае, когда окна документов maximized. 

Возможно, проблема в MFC функции CWinApp::OnIdle(). При ожидании происходит постоянная посылка WM_MDIGETACTIVE сообщений MDIClient'у. Передаваемый lParam является указателем типа BOOL. Этой переменной присваивается TRUE, если окно maximized. Похоже, что в эта перемнная как-то используется, для определения состояния ожидания.

В случае если переменную lParam игнорировать или присваивать ей всегда FALSE, ошибка не наблюдается.


Comment 2 Илья Шпигорь 2008-09-12 13:01:32 MSD
Выложил патч. 

Он заключается в том, что переменная lParam для сообщения WM_MDIGETACTIVE игнорируется, если число child окон стало больше одного.
Comment 3 Анатолий Лютин 2008-09-12 13:19:28 MSD
Возможно повлияет на работу окон 1с, посмотри предпоследнюю багу про неправильное возвращение к предыдущему окну в 1с.
Comment 4 Илья Шпигорь 2008-09-12 13:58:42 MSD
Патч имеет побочный эффект. Начиная со второго child окна каждое следующее создается максимизированным. 
Решение нужно пересмотреть.
Comment 5 Илья Шпигорь 2008-09-12 15:15:31 MSD
Выложил патч [TRY 2].

Для определения состояния ожидания ввел флаг MDIF_IDLE. Он устанавливается в результате последовательности WM_MDIGETACTIVE сообщений с определнными lParam:
1) передача одного и того же адреса в lParam
2) передача одного и того же адреса в lParam чередуется с lParam = NULL

Флаг сбрасывается как только WM_MDIGETACTIVE передает lParam с адресом отличным от предыдущего.

Возможны случаи блокировки и корректных WM_MDIGETACTIVE запросов, но побочных эффектов пока не обнаружено (багу с неправильным возвращением к предыдущему
окну не ломает).

Можно доработать алгоритм, чтобы устанавливать флаг после получения определнного числа одних и тех же признаков (например 3-х). Это исключит ложные срабатывания, но немного усложнит решение.
Comment 6 Денис Баранов 2008-09-17 19:53:42 MSD
На последней сборке eter22 не воспроизвелось.