MDI Synchronization — шаблон для синхронизации MDI дочерних окон

  • Источник: стандартная помощь к Clarion 6.x
  • Дата публикации: 29.12.2005

В версии 6.х Клариона появился новый шаблон для синхронизации открытия MDI дочерних окон. Существует два шаблона — глобальный (Global Extension), который подключается в секции Global и локальный (Local Extension), который подключается непосредственно к процедуре.

Глобальный шаблон MDI Synchronization
В настройках глобального шаблона существует только один check-box, который используется для подключения класса синхронизации. По умолчанию, все процедуры содержат объект класса MDI синхронизации, за исключением процедур отчетов. Вы можете переключать этот check-box для тестирования приложения «с» и «без» объекта синхронизации.

Для чего необходимо использовать этот шаблон
Основываясь на наших тестах и на взаимодействии с Microsoft, мы выделили два значительных фактора, которые определяют появление проблемы в многопоточных MDI приложениях:

  • Присутствие меню на дочернем MDI окне
  • Очень быстрое открытие и закрытие MDI-окон

Меню на дочерних окнах может служить источником проблем в основном только, если это окно «максимизировано».

Ниже представлены наиболее «худшие» случаи, когда проблема может возникнуть:

  • дочерние MDI окна открываются в цикле и, либо изначально максимизируются, либо программа максимизирует их основываясь на информации сохраненной в INI-файле или в реестре
  • программа делает что-то, что требует обновления внутренней MDI-структуры операционной системой, и перед тем как это обновление заканчивается, начинается другая операция, которая также требует обновления этой внутренней структуры. Например, открытие другого окна на событии Event:Sized. В точке обработки этого события, операционная система может не выполнить обновление внутренней структуры ассоциированной с первым MDI-окном, поэтому эта структура может быть повреждена
  • программа использует меню на дочерних MDI окнах и окна открываются максимизированными в цикле

Эффекты, которые вы можете видеть

  • менюбар на фрэйме может быть обновлен некорректно
  • список открытых окон (STD:Windows list) может содержать меньше окон, чем открыто на самом деле
  • под Win9x/ME возможно получить GPF либо при максимизации, либо при выборе распределения окон (tile, cascade)
  • «левые» кнопки в меню фрэйма, возникающие при открытии-максимизации нескольких дочерних окон

Пример «плохого» кода

 MyCounter = GETINI( 'MDIsettings', 'NumberOfWindowsToOpen')
 LOOP MyCounter times
    START(MDIwindowProc, 25000)
 END

Скорее всего данный код приведет к вышеописанным проблемам, с высокой вероятностью они возникнут на медленных машинах или на машинах с ОС Win9x/ME.
В основном это плохая практика использовать вышеприведенный код, особенно при использовании на Win9x. Однако, результаты наших тестов с использование 6.x RTL и нового MDI Synchronization шаблона/класса в основном положительны, т.е. этот шаблон снимает вышеперечисленные проблемы, но это не гарантируется полностью, так как возникновение проблем зависит от факторов, которые находятся вне программы, таких как Операционная система, скорость процессора, доступная память, количество запущенных программ.

Итог
Большинство проблем можно избежать, если использовать данный шаблон, однако решение некоторых проблем достигается путем изменения программного кода.

Локальный шаблон MDI Synchronization
Данный шаблон подключается почти ко всем процедурам приложения после подключения глобального шаблона. Внутри шаблона есть, также check box, позволяющий отключить данный шаблон.

Рисунок 1 — «Левые» кнопки в меню фрэйма

© StillZero, 2005-2006. Все права защищены.