0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
1

Отладчик работает не так как казалось бы должен

05.05.2015, 12:19. Показов 2877. Ответов 40
Метки нет (Все метки)

Прошу объяснить, почему отладчик работает не так как казалось бы должен. Т.е. привожу для примера такой код:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
; Создаём окно.
 OpenWindow(1,150,200,200,100,"Заголовок окна",#PB_Window_MinimizeGadget)
 CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
 ButtonGadget(2,50,30,80,25,"Кнопка")
 
 Repeat ; Начало главного цикла.
 Event=WaitWindowEvent() ; Получаем идентификатор события.
 Gadget=EventGadget() ; Узнаём идентификатор активного гаджета.
  If Event=#PB_Event_Gadget And Gadget=2 ; Условие будет выполнено при щелчке по кнопке.
    MessageRequester("Сообщение","Была нажата кнопка") ; Выводим на экран сообщение.
   EndIf 
  Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
  
  End ; Директива, завершающая программу.
Я устанавливаю точку останова в 3 строке затем запускаю программу для симуляции. И что наблюдаю. После выполнения 2 строки появляется основное окно программы. Казалось бы, что после выполнения 4 строки должна была бы появиться кнопка в основном окне программы. Но я её не вижу. И сколько бы я не делал шагов кнопка так и не появляется. Почему?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2015, 12:19
Ответы с готовыми решениями:

Собрал пк но он не работает так как должен
Комплектующие: AMD FX 8320 GTX 660 m5a97 r2.0 8 ОЗУ 4х4 Суть в том что я играю 2 игры всего...

График параболы в окне не выводится (а, казалось бы, должен)
.386 .model flat,stdcall option casemap:none WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ...

На ПК интернет работает так, как и должен, как я подключил интернет к ноутбуку скорость упал на несколько раз
и пинг в играх от 500 до 1000 доходит. На сайтах тоже грузит долго.На вирус проверял не...

Отладчик - как сделать так чтобы в качестве значений отоборажались НЕ Синонимы
Доброй ночи уважаемые форумчане !!! Прошу помощи у гуру ... Есть ли какая настройка чтобы при...

40
2919 / 1432 / 181
Регистрация: 28.10.2011
Сообщений: 5,278
Записей в блоге: 6
05.05.2015, 18:26 2
Цитата Сообщение от vladh Посмотреть сообщение
привожу для примера такой код
Пример не самый удачный.
В данном случае, дело не в отладчике, а в реализации окон в винде. Для нормальной отрисовки (и не только) окна, его события должны своевременно обрабатываться, а когда программа пошагово выполняется, этого не происходит и окно "виснет".
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
05.05.2015, 18:35  [ТС] 3
Тогда какой смысл в таком отладчике? Я пробовал ставить две точки останова и скакать между ними. Результат тот же - плохой. И Вы хотите сказать, что отладчик нормальный, сама Windows плохая? Но это не так.
0
2919 / 1432 / 181
Регистрация: 28.10.2011
Сообщений: 5,278
Записей в блоге: 6
05.05.2015, 19:46 4
Цитата Сообщение от vladh Посмотреть сообщение
Тогда какой смысл в таком отладчике?
Смысл есть.
Отладчик обычно используется для пошагового выполнения программы с возможностью просмотра содержимого всех переменных, массивов, структур и т. д. https://www.cyberforum.ru/atta... 1316531307
Если создавать окно в пошаговом режиме, то его содержимое все равно не увидите. Почему? Уже отвечал - события окна не обрабатываются! Вспомните что происходит с окном программы, которая зависла? Обычно содержимое окна исчезает и в заголовке появляется сообщение что программа не отвечает. Так вот, программу выполняемую пошагово, можно считать зависшей, т. к. ее работа полностью остановлена.

Цитата Сообщение от vladh Посмотреть сообщение
И Вы хотите сказать, что отладчик нормальный, сама Windows плохая?
Ничего говорить не буду. Со временем сами все поймете. Нужно взять за правило что события окна должны обрабатываться, иначе окно "повиснет". Такая особенность у окон.
Добавил в ваш пример одну строку Delay(1000), которая создает секундную задержку что сильно замедляет обработку событий.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
; Создаём окно.
OpenWindow(1,150,200,200,100,"Заголовок окна",#PB_Window_MinimizeGadget)
CreateGadgetList( WindowID(1) ) ; Создаём пустой список гаджетов.
ButtonGadget(2,50,30,80,25,"Кнопка")
 
Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget()    ; Узнаём идентификатор активного гаджета.
  If Event=#PB_Event_Gadget And Gadget=2 ; Условие будет выполнено при щелчке по кнопке.
    MessageRequester("Сообщение","Была нажата кнопка") ; Выводим на экран сообщение.
  EndIf 
  
  Delay(1000)
  
Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
 
End ; Директива, завершающая программу.
Запустите и посмотрите через какое время появится кнопка в окне.
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
05.05.2015, 20:10  [ТС] 5
После Вашего примера все стало более нехорошо. Если его запустить, то кнопка появляется(на моем компьютере) секунд через 6!? Это вообще ни в какие ворота. И вообще, ну я понимаю в случае недостатка памяти, малой тактовой частоты и т.п. программа может выполняться с задержками. Но Объясните мне как при шаговом выполнении она вообще не выполняет указанные команды? Из того что Вы мне пока говорили ничего меня не убедило.
0
2919 / 1432 / 181
Регистрация: 28.10.2011
Сообщений: 5,278
Записей в блоге: 6
05.05.2015, 20:48 6
Команды выполняются. Просто кнопка не отображается в окне, потому что оно не перерисовывается из-за отсутствия обработки событий. Так устроены окна.
Реально ни разу не видели как виснут проги с отображением надписи "не отвечает" в заголовке окна? При этом содержимое окна обычно пропадает. Тоже самое происходит при пошаговой отладке.
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
05.05.2015, 21:00  [ТС] 7
Разумеется зависания программ я видел. Но здесь то это причем? Причина зависаний программ чаще всего можно объяснить ошибками кода(в первую очередь). Но в данном случае в динамике код работает так как я заказываю, хотя в Вашем примере с секундной задержкой он тоже работает неверно. В случае отладки ему ничто не должно мешать(кроме как неверно прописанной программы отладки). Обычно я пишу программы работы МК и симулирую их работу в Proteuse. Так вот там подобная ситуация приводит к панике в работе программы. А здесь Вы говорите, что это ничего страшного, зато можно отслеживать состояние переменных.
0
Модератор
8783 / 3277 / 845
Регистрация: 22.02.2013
Сообщений: 4,951
Записей в блоге: 78
05.05.2015, 21:36 8
Цитата Сообщение от vladh Посмотреть сообщение
Но здесь то это причем?
Как при чем? Ты выполняешь программу пошагово. Любая активность окна (отрисовка, обработка сообщений мыши и практически все) также выполняются пошагово, т.е. это все не может происходить само собой, для этого ты должен выбрать сообщение из очереди и отправить его окну. Ты до этого даже не доходишь. Тоже самое в любом отладчике такого типа.
0
2919 / 1432 / 181
Регистрация: 28.10.2011
Сообщений: 5,278
Записей в блоге: 6
05.05.2015, 22:14 9
Цитата Сообщение от vladh Посмотреть сообщение
Но здесь то это причем?
Потому что работа программы полностью останавливается, т. е. фактически программа виснет.

Цитата Сообщение от vladh Посмотреть сообщение
Но в данном случае в динамике код работает...
...Обычно я пишу программы работы МК и симулирую их работу в Proteuse.
Представьте что у вас есть код для МК, который в цикле опрашивает кнопку, подключенную в одному из выводов МК. В динамике все будет работать нормально и МК без ошибок и пропусков определит момент нажатия и отпускания кнопки. А теперь представьте что код в МК выполняется в пошаговом режиме, скажем один шаг в две секунды. Сможет ли МК при этом зафиксировать изменения состояния кнопки при условии что при этом выполняется другой код (не опрос порта МК)? Разве это из-за проблемы в отладчике? Т. е. отладчик каким-то образом должен "догадаться" о кнопке, "висящей" на порту МК и опрашивать ее?
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
06.05.2015, 05:51  [ТС] 10
Цитата Сообщение от The trick Посмотреть сообщение
Ты выполняешь программу пошагово. Любая активность окна (отрисовка, обработка сообщений мыши и практически все) также выполняются пошагово, т.е. это все не может происходить само собой, для этого ты должен выбрать сообщение из очереди и отправить его окну. Ты до этого даже не доходишь.
Нет, не я выполняю программу "пошагово", а отладчик(1). Я нигде и не говорю, что все происходит само собой. Код работает в первую очередь под управлением отладчика и моим(2). Т.е. Отладчик должен выполнить строку программы и остановиться(пошагово). После этого отладчик может заниматься чем угодно(хоть пиво пить), но постоянно должен быть готовым выполнить прерывание от клавиатуры или мышки. После получения очередного прерывания, отладчик должен(!) выполнить следующую строку кода. Например, создать(отрисовать на экране) кнопку. И если он её не выполняет то это значит, что он работает неправильно. По моему все достаточно логично.

Добавлено через 9 минут
Цитата Сообщение от locm Посмотреть сообщение
Представьте что у вас есть код для МК, который в цикле опрашивает кнопку, подключенную в одному из выводов МК. В динамике все будет работать нормально и МК без ошибок и пропусков определит момент нажатия и отпускания кнопки. А теперь представьте что код в МК выполняется в пошаговом режиме, скажем один шаг в две секунды. Сможет ли МК при этом зафиксировать изменения состояния кнопки при условии что при этом выполняется другой код (не опрос порта МК)? Разве это из-за проблемы в отладчике? Т. е. отладчик каким-то образом должен "догадаться" о кнопке, "висящей" на порту МК и опрашивать ее?
Пример не совсем корректный. Когда я запускаю в работу с кодом отладчик, то это не значит, что теперь компьютер полностью начинает работать в пошаговом режиме. Все параллельные программы как работали так и работают. Но вот мой исследуемый код должен работать пошагово. Т.е. встретился с командой "нарисовать окно", он должен нарисовать его так быстро, как позволяет это аппаратная и программная часть компьютера. Ну почему не так?

Добавлено через 9 минут
Мне кажется, что компилятор переписывает код программы как то по своему. Он меняет порядок выполнения команд.
0
Модератор
6784 / 2802 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
06.05.2015, 06:43 11
Цитата Сообщение от vladh Посмотреть сообщение
создать(отрисовать на экране) кнопку. И если он её не выполняет то это значит, что он работает неправильно. По моему все достаточно логично.
Логика человека, который не знаком с принципами работы оконного приложения.
Скомпилируйте ваш код, запустите под общеизвестным "правильным" отладчиком, к примеру Olly Debugger. Выполняйте пошагово, сравните результат.
Цитата Сообщение от vladh Посмотреть сообщение
Мне кажется, что компилятор переписывает код программы как то по своему.
Это да, на то он и компилятор. Оптимизирует, убирает мусор, переписывает с почти человеческого Бейсика в абсолютно машинный код, но логику программы точно сохраняет. Я проверял. Лично.
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
06.05.2015, 07:24  [ТС] 12
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Скомпилируйте ваш код, запустите под общеизвестным "правильным" отладчиком, к примеру Olly Debugger. Выполняйте пошагово, сравните результат.
Из быстрого просмотра описания этого универсального инструмента я понял, что он работает с машинными кодами. Но там я подозреваю уже ход первоначального текста программы может быть изменен. Здесь же разговор идет о своем отладчике, который должен пошагово проверять работу исходного текста программы написанной именно на этом языке.

Добавлено через 25 минут
В данном случае отладчик Пуре Бейсик может быть даже работает не с компилированным кодом. Он может быть с основным текстом программы обращается как то по своему. Но мне надо, чтобы отладчик продемонстрировал выполнение моих команд в данном конкретном месте текста программы. Если я, напрмер, хочу в данном месте сложить два числа и увидеть результат этой работы, а он(отладчик) мне этого не покажет в данный момент времени то как это называется?
0
Модератор
6784 / 2802 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
06.05.2015, 08:01 13
Цитата Сообщение от vladh Посмотреть сообщение
В данном случае отладчик Пуре Бейсик может быть даже работает не с компилированным кодом
Не пишите ерунду, лучше изучите матчасть, к примеру, что это за файл создается с именем PureBasic_Compilation0.exe?
Цитата Сообщение от vladh Посмотреть сообщение
хочу в данном месте сложить два числа и увидеть результат этой работы, а он(отладчик) мне этого не покажет
К чему эти гнусные инсинуации, не подтвержденные на практике реальными примерами?
Что положено делать отладчику он делает, остальное ваши хотелки, противоречащие принципам работы системы.
0
Модератор
8783 / 3277 / 845
Регистрация: 22.02.2013
Сообщений: 4,951
Записей в блоге: 78
06.05.2015, 10:05 14
Цитата Сообщение от vladh Посмотреть сообщение
Я нигде и не говорю, что все происходит само собой.
Ты так хочешь чтобы все происходило само собой. Так скажи мне каким образом должно отрисовываться окно если код остановлен на конкретной инструкции?
0
2919 / 1432 / 181
Регистрация: 28.10.2011
Сообщений: 5,278
Записей в блоге: 6
06.05.2015, 10:09 15
Цитата Сообщение от vladh Посмотреть сообщение
После этого отладчик может заниматься чем угодно(хоть пиво пить), но постоянно должен быть готовым выполнить прерывание от клавиатуры или мышки. После получения очередного прерывания, отладчик должен(!) выполнить следующую строку кода.
Винда не позволяет приложениям обрабатывать аппаратные прерывания. Это доступно только ядру системы и драйверам. Но даже драйверы не могу непосредственно получить доступ к обработке прерывания, а должны подписаться на него, например, с помощью функции ядра IoConnectInterrupt().
Даже если предположить что приложение может обрабатывать прерывания, то код их обработчика также должен выполнятся в пошаговом режиме.

Цитата Сообщение от vladh Посмотреть сообщение
Например, создать(отрисовать на экране) кнопку. И если он её не выполняет то это значит, что он работает неправильно. По моему все достаточно логично.
В древности, люди считали что гром и молния это дело рук Зевса, Тора и т. д. Они не знали что на самом деле это электрические разряды в облаках.
Вы ведете себя как те древние люди. Не зная как работает операционная система и программы в ней, доказываете что все не так как должно. Дело не в отладчике, а в устройстве окон и чем быстрее это поймете, тем лучше для вас.

Цитата Сообщение от vladh Посмотреть сообщение
Когда я запускаю в работу с кодом отладчик, то это не значит, что теперь компьютер полностью начинает работать в пошаговом режиме. Все параллельные программы как работали так и работают.
Правильно. Окно рисует не отлаживаемая программа, а операционная система. Она ждет от программы обработки событий окна, но поскольку программа выполняется в пошаговом режиме, события не обрабатываются. Это понятно?

Цитата Сообщение от vladh Посмотреть сообщение
Т.е. встретился с командой "нарисовать окно", он должен нарисовать его так быстро, как позволяет это аппаратная и программная часть компьютера.
Не поверите, именно так и происходит, но вы не читаете что вам пишут. Продублирую.
Цитата Сообщение от locm Посмотреть сообщение
Команды выполняются. Просто кнопка не отображается в окне, потому что оно не перерисовывается из-за отсутствия обработки событий. Так устроены окна.
Надеюсь это понятно? Все команды выполняются и кнопка создается, а не отображается из-за отсутствия обработки событий окна. Чтобы события обрабатывались, нужно вызывать функцию WaitWindowEvent() или WindowEvent(), но в программе выполняемой пошагово этого не происходит, или происходит очень редко.

Цитата Сообщение от vladh Посмотреть сообщение
Если я, например, хочу в данном месте сложить два числа и увидеть результат этой работы, а он(отладчик) мне этого не покажет в данный момент времени то как это называется?
Это называется невнимательность. Давал выше ссылку где в картинках показано как посмотреть значения переменных в программе, выполняемой пошагово. Есть много способов это сделать. Несколько из них.
1. Использовать команду Debug.
2. Открыть окно "Просмотр переменных" из меню "Отладчик".
3. Навести мышку на интересующую переменную и ее значение отобразится во всплывающем окне.

Все это показано в картинках по ссылке выше. Видимо даже не смотрели...
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
06.05.2015, 10:14  [ТС] 16
Цитата Сообщение от The trick Посмотреть сообщение
Ты так хочешь чтобы все происходило само собой. Так скажи мне каким образом должно отрисовываться окно если код остановлен на конкретной инструкции?
Во-первых я же и сказал, что ничего не происходит самой собой. Вот я же записал в 4 строчке: "ButtonGadget(2,50,30,80,25,"Кнопка")". Объясните мне пж. что должна сделать программа встретив на своем пути эту строчку?
0
2919 / 1432 / 181
Регистрация: 28.10.2011
Сообщений: 5,278
Записей в блоге: 6
06.05.2015, 10:19 17
Выше уже писал что кнопка создается, а не отображается из-за отсутствия обработки событий. В вашем коде при пошаговой отладке, сколько раз в секунду выполняется функция WaitWindowEvent()? Должна выполнятся хотя бы 20 раз в секунду чтобы своевременно обрабатывать события окна.
0
Модератор
8783 / 3277 / 845
Регистрация: 22.02.2013
Сообщений: 4,951
Записей в блоге: 78
06.05.2015, 10:22 18
Цитата Сообщение от vladh Посмотреть сообщение
Во-первых я же и сказал, что ничего не происходит самой собой.
Еще раз. Ты этого хочешь.
Цитата Сообщение от vladh Посмотреть сообщение
Объясните мне пж. что должна сделать программа встретив на своем пути эту строчку?
Я думаю (точно не знаю, но полагаясь на свой опыт исследования программ) будет выполнено (в Windows) CreateWindowEx. Выделяется память для структур окна, возможно сначала даже будет зарегистрирован новый класс окна (если этого не делает CreateGadgetList), обработаны сообщения WM_NCCREATE, WM_CREATE и т.п, которые обрабатываются внутри функции CreateWindowEx. Отрисовка имеет самый низкий приоритет и поэтому всегда выполняется в самом конце, когда в очереди нет больше сообщений. А ты хочешь чтобы твоя кнопка появилась, даже не начав обрабатывать какие-либо события.
0
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 33
06.05.2015, 10:38  [ТС] 19
Я готов согласится с locm,
Цитата Сообщение от locm Посмотреть сообщение
Команды выполняются. Просто кнопка не отображается в окне, потому что оно не перерисовывается из-за отсутствия обработки событий. Так устроены окна.
Но тогда встоет вопрос6 "Когда же она нарисуется?" Уважаемый locm говорит, что она должна появиться когда будут вызваны функции WaitWindowEvent() или WindowEvent(). Но эта функция постоянно вызывается в цикле(строчка 7) и ничего.

Добавлено через 6 минут
Цитата Сообщение от The trick Посмотреть сообщение
А ты хочешь чтобы твоя кнопка появилась, даже не начав обрабатывать какие-либо события.
Для того чтобы обрабатывалось событие связанное с этой кнопкой надо вначале нарисовать эту кнопку! Просто отладчик в этой программе представлен с претензией и на симуляцию работы программы. Но это не работает. Пусть бы он не пытался выводить окно разрабатываемой программы. Просто бы выводил указатель обрабатываемой строки, состояние переменных, регистров. И тогда у меня бы не возникло вопросов.
0
2919 / 1432 / 181
Регистрация: 28.10.2011
Сообщений: 5,278
Записей в блоге: 6
06.05.2015, 10:46 20
Цитата Сообщение от vladh Посмотреть сообщение
Уважаемый locm говорит, что она должна появиться когда будут вызваны функции WaitWindowEvent() или WindowEvent().
Я говорю следующее.
Цитата Сообщение от locm Посмотреть сообщение
В вашем коде при пошаговой отладке, сколько раз в секунду выполняется функция WaitWindowEvent()? Должна выполнятся хотя бы 20 раз в секунду чтобы своевременно обрабатывать события окна.
Сколько раз в секунду вызывается эта функция при пошаговой отладке?
Окно генерирует много событий и их все нужно объять из очереди, иначе операционная система "считает" что программа зависла.
Запустите этот код и посмотрите насколько часто и в каких случаях появляются события.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; Создаём окно.
OpenWindow(1,150,200,200,100,"Заголовок окна",#PB_Window_MinimizeGadget)
 
ButtonGadget(2,50,30,80,25,"Кнопка")
 
Count = 0
 
Repeat ; Начало главного цикла.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  
  Debug "Событие №"+Str(Count)+"    код: "+Str(Event)
  Count + 1
  
  Gadget=EventGadget()    ; Узнаём идентификатор активного гаджета.
  If Event=#PB_Event_Gadget And Gadget=2 ; Условие будет выполнено при щелчке по кнопке.
    MessageRequester("Сообщение","Была нажата кнопка") ; Выводим на экран сообщение.
  EndIf 
Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
 
End ; Директива, завершающая программу.
Добавлено через 5 минут
Цитата Сообщение от vladh Посмотреть сообщение
Для того чтобы обрабатывалось событие связанное с этой кнопкой надо вначале нарисовать эту кнопку!
Дайте ссылку на MSDN (документацию) от майкрософт где написано что должно быть именно так.
По видимому умные дядьки-программисты из майкрософта с вами не согласны.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2015, 10:46
Помогаю со студенческими работами здесь

Казалось бы простой запрос, а не работает!
Здравствуйте! Тема очень простая на первый взгляд. У меня есть таблица: id user_id 1 5 2 ...

Казалось бы, эквивалентные if, но один работает, а второй нет
Добрый день! Пишу свое посимвольное сравнение (условия задачи не позволяют equalsIgnoreCase...

Не строит как должен, или делаю что-то не так?
Господа, столкнулся с задачей. Необходимо решить уравнение, на рисунке оно (10) и построить на...

Объект перемещается не так как должен - подскажите где ошибка
По идее, квадрат должен двигаться вправо-вниз, но двигается во влево вниз. В чём может быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru