 |
ViewіWatches (ОбзоріПросмотр), то вы увидите, что оно остается
равным -1 при пошаговом прохождении программы. Это так и должно
быть, поскольку нарисовать что-либо вы не имели возможности.
Нахождение ошибки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Теперь, если вы обратитесь к книге Чарльза Петцольда "Прог-
раммирование для Windows" ("Charles Petzold, Programming
Windows"), то причина ошибки станет вам ясна. Минимальная реак-
ция, которая нужна Windows в ответ на сообщение WM_PAINT, должна
состоять в вызове BeginPaint, за которым следует EndPaint. Если
эти подпрограммы не вызываются, то Windows не знает, что было по-
лучено сообщение WM_PAINT, и продолжает посылать WM_PAINT прог-
рамме.
Обратите внимание, что вызов BeginPaint находился внутри
оператора if, и подпрограмма при первой прорисовке экрана не вы-
зывалась. Чтобы решить проблему, вы должны вынести оператор с вы-
зовом BeginPaint за пределы условного оператора if.
Как обстоит дело с оператором EndPaint? Он тоже находится
внутри if, вместе с вызовом подпрограммы ReleaseDC, которая осво-
бождает hdc, логический номер (описатель) контекста устройства,
устанавливаемый вызовом BeginPaint. Эти две строки должны нахо-
диться вне конструкции if.
Завершение BCWDEMOA
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В BCWDEMOB, второй версии программы, которую вы будете изу-
чать, ошибка, связанная с WM_PAINT, уже исправлена. Прежде чем
загружать эту программу, нужно завершить работу BCWDEMOA, чтобы
освободить используемые ей ресурсы. Поскольку единственная проб-
лема с этой программой состояла в том, что при первом проходе не
выполнялся код внутри оператора if, установка CurrentPointer в
TDeb 3.0 #3-3 = 56 =
ноль приведет к выполнению этого кода, что позволяет нормально
выйти из программы. Для завершения программы выполните следующие
шаги:
1. В окне Windows Messages (Сообщения Windows) уберите имя
оконной процедуры WndProc в левой верхней области, чтобы
программа не была прервана при получении сообщения
WM_PAINT.
2. Нажимайте F7, пока на дисплее не появится следующая стро-
ка:
if (Currentpointer >= 0)
3. Выделите CurrentPoint, затем нажмите клавиши Ctrl-F4,
чтобы перейти к экрану Evaluate/Modify (Вычисление/Моди-
фикация).
4. Выберите Eval (Вычисление).
5. Поместите курсор на поле ввода New Value (Новое значе-
ние), введите 0, а затем выберите Modify (Модификация),
чтобы изменить значение переменной. Теперь при выполнении
программы оператор if при вычислении условия даст значе-
ние True, а BeginPaint и EndPaint будут выполнены при
первом же проходе.
6. Выберите клавишу F9 для выполнения программы.
7. Выберите Quit для выхода из программы. Чтобы эта команда
сработала, вам может понадобиться нажать клавишу, пос-
кольку Windows может отказаться освободить сообщения вво-
да от "мыши" из системной очереди. Нажатие клавиши осво-
бодит из очереди все находящиеся там в текущий момент со-
общения ввода от "мыши".
Отладка BCWDEMOB
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Завершив работу программы BCWDEMOA, вы можете загрузить
программу BCWDEMOB. Когда программа появится на экране, нажмите
для ее запуска клавишу F9, и попробуйте немного поработать с
программой.
Если вы нарисовали большое число объектов, и особенно при
интенсивном перемещении "мыши" при нажатой кнопке, вы увидите в
конце-концов, что с программой начинают происходить странные ве-
щи. Сначала вы сможете заметить,что программа стала медленнее ра-
ботать, а затем объекты исчезают или изменяется цвет или толщина
линий, а экраны перемешиваются. И наконец, все зависает, и вам
приходится перезагружаться аппаратным образом.
Наиболее вероятная причина состоит в ошибочном использовании
TDeb 3.0 #3-3 = 57 =
памяти. Чтобы проверить, так ли это, и найти местоположение ошиб-
ки, повторите загрузку Windows, выполните только менеджер прог-
рамм и TDW, если это возможно (чтобы минимизировать использование
памяти), и загрузите BCWDEMOB и TDW снова.
Переключение из программы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Прежде чем продолжить сеанс отладки, может потребоваться ор-
ганизовать отладку таким образом, чтобы не использовать
Ctrl-Alt-SysRq для переключения из перекладной программы в TDW,
поскольку использование данного метода требует осторожности. Ре-
шение состоит в том, чтобы установить единственное сообщение, по
которому должно выполняться прерывание, и которое вы по своему
желанию можете генерировать в программе, и которое обычно само по
себе не появляется.
Так как BCWDEMO - это работающая с "мышью" графическая прог-
рамма, не принимающая графического ввода, то работа с клавиатурой
здесь обычно не нужна. Следовательно, лучше всего организовать
прерывание по сообщению WM_KEYFIRST. После задания этого сообще-
ния в окне ViewіWindows Message (ОбзоріСообщения Windows) прог-
рамма будет прерываться при каждом нажатии клавиши. (Поскольку
программа не реагирует и на нажатие правой кнопки "мыши", для
этой цели можно использовать и сообщение WM_RBUTTONDOWN).
Тестирование программы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Теперь вы можете нажать клавишу F9, чтобы начать выполнение
программы BCWDEMOB. Прежде чем сделать что-либо в программе, про-
верьте, какой процент системной памяти доступен программам для
Windows, переключившись на менеджер программ, выбрав "кнопку"
Help (Справка) и затем выбрав About Program Manager (О менеджере
программ). Появится информационный блок, в котором будет показана
текущая версия Windows, объем свободной памяти и в нижней части -
интересующие вас статистические данные, процентные соотношения
свободной памяти для системных ресурсов.
Теперь вернемся в программа Simple Paint и немного порисуем.
Затем снова перейдем на экран About Program Manager (О менеджере
программ), и вы увидите, что доступная память для системных ре-
сурсов уменьшилась. Если вы и дальше продолжите рисование, то
объем этой памяти будет продолжать уменьшаться до нуля, и вы по-
лучите тот же эффект, что и ранее.
Принятие решения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Что вам известно в данный момент? Прежде всего, программа
явно распределяет глобальную память, так как она в результате
расходует все системные ресурсы, доступные Windows. С этого можно
начать: вы можете перезагрузить программу, воспользоваться средс-
TDeb 3.0 #3-3 = 58 =
твами TDW контроля глобальной памяти для сохранения списка объек-
тов глобальной памяти в файл регистрации (протокол), немного по-
рисовать в Simple Paint и затем снова получить список объектов
глобальной памяти, записав его в другой файл.
Так как Windows за это время, вероятно, перемещала объекты в
памяти, то два полученных списка могут не совпадать. Вы должны
просмотреть каждый объект в списке и сопоставить его с объектами,
имеющими того же владельца в другом списке, чтобы найти несоот-
ветствия.
Поскольку этот метод занимает много времени, то предлагается
он только как упражнение по просмотру глобальной памяти. Метод,
которым вы будете пользоваться фактически, состоит в том, чтобы
просмотреть объекты памяти, выделяемые программой, и проверить,
выполняет ли программа и их освобождение.
Сравнение списков объектов глобальной памяти
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Для получения списка объектов глобальной памяти нужно выпол-
нить следующие действия:
1. Перезапустите Windows, чтобы обеспечить очистку глобаль-
ной памяти от любых объектов, выделенных BCWDEMOB. И
опять, избегайте запускать ненужные программы, чтобы
уменьшить число объектов глобальной памяти.
2. Если вы находитесь в TDW и загрузили BCWDEMOB, снова
установите прерывание программы по сообщению WM_KEYFIRST.
3. Нажмите клавишу F9 для запуска программы, а затем нажмите
клавишу для выхода обратно в TDW.
4. Выберите команду ViewіLog (ОбзоріРегистрация) и вызовите
локальное меню.
5. Выберите команду Open LogіFile (Открыть файліРегистра-
ция), введите в появившемся окне диалога имя файла журна-
ла и нажмите клавишу Enter.
6. Снова вызовите локальное меню окна Log (Регистрация), вы-
берите команду Display Windows Info (Вывод информации
Windows), а затем нажмите клавишу Enter, когда появится
окно диалога Windows Information (Информация Windows).
Нажатие Enter принимает установки по умолчанию, задающие
вывод списка объектов глобальной памяти, начиная с верх-
них адресов памяти.
|