Summary: | Компас: Некорректная работа при количестве открытых документов более одного | ||
---|---|---|---|
Product: | [Поддержка проектов] КОМПАС 3D | Reporter: | Виталий Булгаков <bulgakov> |
Component: | Тестирование | Assignee: | Илья Шпигорь <shpigor> |
Status: | CLOSED FIXED | QA Contact: | Денис Баранов <baraka> |
Severity: | critical | ||
Priority: | P2 | CC: | baraka, lav, mais, mx, pav, vostok |
Version: | v10 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 753 |
Description
Виталий Булгаков
2008-09-01 12:02:41 MSD
Ошибка наблюдается в случае, когда окна документов maximized. Возможно, проблема в MFC функции CWinApp::OnIdle(). При ожидании происходит постоянная посылка WM_MDIGETACTIVE сообщений MDIClient'у. Передаваемый lParam является указателем типа BOOL. Этой переменной присваивается TRUE, если окно maximized. Похоже, что в эта перемнная как-то используется, для определения состояния ожидания. В случае если переменную lParam игнорировать или присваивать ей всегда FALSE, ошибка не наблюдается. Выложил патч. Он заключается в том, что переменная lParam для сообщения WM_MDIGETACTIVE игнорируется, если число child окон стало больше одного. Возможно повлияет на работу окон 1с, посмотри предпоследнюю багу про неправильное возвращение к предыдущему окну в 1с. Патч имеет побочный эффект. Начиная со второго child окна каждое следующее создается максимизированным. Решение нужно пересмотреть. Выложил патч [TRY 2]. Для определения состояния ожидания ввел флаг MDIF_IDLE. Он устанавливается в результате последовательности WM_MDIGETACTIVE сообщений с определнными lParam: 1) передача одного и того же адреса в lParam 2) передача одного и того же адреса в lParam чередуется с lParam = NULL Флаг сбрасывается как только WM_MDIGETACTIVE передает lParam с адресом отличным от предыдущего. Возможны случаи блокировки и корректных WM_MDIGETACTIVE запросов, но побочных эффектов пока не обнаружено (багу с неправильным возвращением к предыдущему окну не ломает). Можно доработать алгоритм, чтобы устанавливать флаг после получения определнного числа одних и тех же признаков (например 3-х). Это исключит ложные срабатывания, но немного усложнит решение. На последней сборке eter22 не воспроизвелось. |