0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 37
|
||||||
Отладчик работает не так как казалось бы должен05.05.2015, 12:19. Показов 3369. Ответов 40
Метки нет Все метки)
(
Прошу объяснить, почему отладчик работает не так как казалось бы должен. Т.е. привожу для примера такой код:
0
|
05.05.2015, 12:19 | |
Ответы с готовыми решениями:
40
Собрал пк но он не работает так как должен
На ПК интернет работает так, как и должен, как я подключил интернет к ноутбуку скорость упал на несколько раз |
![]() |
|
05.05.2015, 18:26 | |
Пример не самый удачный.
В данном случае, дело не в отладчике, а в реализации окон в винде. Для нормальной отрисовки (и не только) окна, его события должны своевременно обрабатываться, а когда программа пошагово выполняется, этого не происходит и окно "виснет".
0
|
![]() |
||||||
05.05.2015, 19:46 | ||||||
Смысл есть.
Отладчик обычно используется для пошагового выполнения программы с возможностью просмотра содержимого всех переменных, массивов, структур и т. д. https://www.cyberforum.ru/atta... 1316531307 Если создавать окно в пошаговом режиме, то его содержимое все равно не увидите. Почему? Уже отвечал - события окна не обрабатываются! Вспомните что происходит с окном программы, которая зависла? Обычно содержимое окна исчезает и в заголовке появляется сообщение что программа не отвечает. Так вот, программу выполняемую пошагово, можно считать зависшей, т. к. ее работа полностью остановлена. Ничего говорить не буду. Со временем сами все поймете. Нужно взять за правило что события окна должны обрабатываться, иначе окно "повиснет". Такая особенность у окон. Добавил в ваш пример одну строку Delay(1000), которая создает секундную задержку что сильно замедляет обработку событий.
0
|
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 37
|
|
05.05.2015, 20:10 [ТС] | |
После Вашего примера все стало более нехорошо. Если его запустить, то кнопка появляется(на моем компьютере) секунд через 6!? Это вообще ни в какие ворота. И вообще, ну я понимаю в случае недостатка памяти, малой тактовой частоты и т.п. программа может выполняться с задержками. Но Объясните мне как при шаговом выполнении она вообще не выполняет указанные команды? Из того что Вы мне пока говорили ничего меня не убедило.
0
|
![]() |
|
05.05.2015, 20:48 | |
Команды выполняются. Просто кнопка не отображается в окне, потому что оно не перерисовывается из-за отсутствия обработки событий. Так устроены окна.
Реально ни разу не видели как виснут проги с отображением надписи "не отвечает" в заголовке окна? При этом содержимое окна обычно пропадает. Тоже самое происходит при пошаговой отладке.
0
|
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 37
|
|
05.05.2015, 21:00 [ТС] | |
Разумеется зависания программ я видел. Но здесь то это причем? Причина зависаний программ чаще всего можно объяснить ошибками кода(в первую очередь). Но в данном случае в динамике код работает так как я заказываю, хотя в Вашем примере с секундной задержкой он тоже работает неверно. В случае отладки ему ничто не должно мешать(кроме как неверно прописанной программы отладки). Обычно я пишу программы работы МК и симулирую их работу в Proteuse. Так вот там подобная ситуация приводит к панике в работе программы. А здесь Вы говорите, что это ничего страшного, зато можно отслеживать состояние переменных.
0
|
Модератор
|
|
05.05.2015, 21:36 | |
Как при чем? Ты выполняешь программу пошагово. Любая активность окна (отрисовка, обработка сообщений мыши и практически все) также выполняются пошагово, т.е. это все не может происходить само собой, для этого ты должен выбрать сообщение из очереди и отправить его окну. Ты до этого даже не доходишь. Тоже самое в любом отладчике такого типа.
0
|
![]() |
|
05.05.2015, 22:14 | |
Потому что работа программы полностью останавливается, т. е. фактически программа виснет.
Представьте что у вас есть код для МК, который в цикле опрашивает кнопку, подключенную в одному из выводов МК. В динамике все будет работать нормально и МК без ошибок и пропусков определит момент нажатия и отпускания кнопки. А теперь представьте что код в МК выполняется в пошаговом режиме, скажем один шаг в две секунды. Сможет ли МК при этом зафиксировать изменения состояния кнопки при условии что при этом выполняется другой код (не опрос порта МК)? Разве это из-за проблемы в отладчике? Т. е. отладчик каким-то образом должен "догадаться" о кнопке, "висящей" на порту МК и опрашивать ее?
0
|
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 37
|
|
06.05.2015, 05:51 [ТС] | |
Нет, не я выполняю программу "пошагово", а отладчик(1). Я нигде и не говорю, что все происходит само собой. Код работает в первую очередь под управлением отладчика и моим(2). Т.е. Отладчик должен выполнить строку программы и остановиться(пошагово). После этого отладчик может заниматься чем угодно(хоть пиво пить), но постоянно должен быть готовым выполнить прерывание от клавиатуры или мышки. После получения очередного прерывания, отладчик должен(!) выполнить следующую строку кода. Например, создать(отрисовать на экране) кнопку. И если он её не выполняет то это значит, что он работает неправильно. По моему все достаточно логично.
Добавлено через 9 минут Пример не совсем корректный. Когда я запускаю в работу с кодом отладчик, то это не значит, что теперь компьютер полностью начинает работать в пошаговом режиме. Все параллельные программы как работали так и работают. Но вот мой исследуемый код должен работать пошагово. Т.е. встретился с командой "нарисовать окно", он должен нарисовать его так быстро, как позволяет это аппаратная и программная часть компьютера. Ну почему не так? Добавлено через 9 минут Мне кажется, что компилятор переписывает код программы как то по своему. Он меняет порядок выполнения команд.
0
|
![]() |
|
06.05.2015, 06:43 | |
Логика человека, который не знаком с принципами работы оконного приложения.
Скомпилируйте ваш код, запустите под общеизвестным "правильным" отладчиком, к примеру Olly Debugger. Выполняйте пошагово, сравните результат. Это да, на то он и компилятор. Оптимизирует, убирает мусор, переписывает с почти человеческого Бейсика в абсолютно машинный код, но логику программы точно сохраняет. Я проверял. Лично.
0
|
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 37
|
|
06.05.2015, 07:24 [ТС] | |
Из быстрого просмотра описания этого универсального инструмента я понял, что он работает с машинными кодами. Но там я подозреваю уже ход первоначального текста программы может быть изменен. Здесь же разговор идет о своем отладчике, который должен пошагово проверять работу исходного текста программы написанной именно на этом языке.
Добавлено через 25 минут В данном случае отладчик Пуре Бейсик может быть даже работает не с компилированным кодом. Он может быть с основным текстом программы обращается как то по своему. Но мне надо, чтобы отладчик продемонстрировал выполнение моих команд в данном конкретном месте текста программы. Если я, напрмер, хочу в данном месте сложить два числа и увидеть результат этой работы, а он(отладчик) мне этого не покажет в данный момент времени то как это называется?
0
|
![]() |
|
06.05.2015, 08:01 | |
Не пишите ерунду, лучше изучите матчасть, к примеру, что это за файл создается с именем PureBasic_Compilation0.exe?
К чему эти гнусные инсинуации, не подтвержденные на практике реальными примерами? Что положено делать отладчику он делает, остальное ваши хотелки, противоречащие принципам работы системы.
0
|
Модератор
|
|
06.05.2015, 10:05 | |
Ты так хочешь чтобы все происходило само собой. Так скажи мне каким образом должно отрисовываться окно если код остановлен на конкретной инструкции?
0
|
![]() |
|
06.05.2015, 10:09 | |
Винда не позволяет приложениям обрабатывать аппаратные прерывания. Это доступно только ядру системы и драйверам. Но даже драйверы не могу непосредственно получить доступ к обработке прерывания, а должны подписаться на него, например, с помощью функции ядра IoConnectInterrupt().
Даже если предположить что приложение может обрабатывать прерывания, то код их обработчика также должен выполнятся в пошаговом режиме. В древности, люди считали что гром и молния это дело рук Зевса, Тора и т. д. Они не знали что на самом деле это электрические разряды в облаках. Вы ведете себя как те древние люди. Не зная как работает операционная система и программы в ней, доказываете что все не так как должно. Дело не в отладчике, а в устройстве окон и чем быстрее это поймете, тем лучше для вас. Правильно. Окно рисует не отлаживаемая программа, а операционная система. Она ждет от программы обработки событий окна, но поскольку программа выполняется в пошаговом режиме, события не обрабатываются. Это понятно? Не поверите, именно так и происходит, но вы не читаете что вам пишут. Продублирую. Надеюсь это понятно? Все команды выполняются и кнопка создается, а не отображается из-за отсутствия обработки событий окна. Чтобы события обрабатывались, нужно вызывать функцию WaitWindowEvent() или WindowEvent(), но в программе выполняемой пошагово этого не происходит, или происходит очень редко. Это называется невнимательность. Давал выше ссылку где в картинках показано как посмотреть значения переменных в программе, выполняемой пошагово. Есть много способов это сделать. Несколько из них. 1. Использовать команду Debug. 2. Открыть окно "Просмотр переменных" из меню "Отладчик". 3. Навести мышку на интересующую переменную и ее значение отобразится во всплывающем окне. Все это показано в картинках по ссылке выше. Видимо даже не смотрели...
0
|
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 37
|
|
06.05.2015, 10:14 [ТС] | |
Во-первых я же и сказал, что ничего не происходит самой собой. Вот я же записал в 4 строчке: "ButtonGadget(2,50,30,80,25,"Кнопка" )". Объясните мне пж. что должна сделать программа встретив на своем пути эту строчку?
0
|
![]() |
|
06.05.2015, 10:19 | |
Выше уже писал что кнопка создается, а не отображается из-за отсутствия обработки событий. В вашем коде при пошаговой отладке, сколько раз в секунду выполняется функция WaitWindowEvent()? Должна выполнятся хотя бы 20 раз в секунду чтобы своевременно обрабатывать события окна.
0
|
Модератор
|
|
06.05.2015, 10:22 | |
Еще раз. Ты этого хочешь.
Я думаю (точно не знаю, но полагаясь на свой опыт исследования программ) будет выполнено (в Windows) CreateWindowEx. Выделяется память для структур окна, возможно сначала даже будет зарегистрирован новый класс окна (если этого не делает CreateGadgetList), обработаны сообщения WM_NCCREATE, WM_CREATE и т.п, которые обрабатываются внутри функции CreateWindowEx. Отрисовка имеет самый низкий приоритет и поэтому всегда выполняется в самом конце, когда в очереди нет больше сообщений. А ты хочешь чтобы твоя кнопка появилась, даже не начав обрабатывать какие-либо события.
0
|
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 37
|
|
06.05.2015, 10:38 [ТС] | |
Я готов согласится с locm,
Но тогда встоет вопрос6 "Когда же она нарисуется?" Уважаемый locm говорит, что она должна появиться когда будут вызваны функции WaitWindowEvent() или WindowEvent(). Но эта функция постоянно вызывается в цикле(строчка 7) и ничего.
Добавлено через 6 минут Для того чтобы обрабатывалось событие связанное с этой кнопкой надо вначале нарисовать эту кнопку! Просто отладчик в этой программе представлен с претензией и на симуляцию работы программы. Но это не работает. Пусть бы он не пытался выводить окно разрабатываемой программы. Просто бы выводил указатель обрабатываемой строки, состояние переменных, регистров. И тогда у меня бы не возникло вопросов.
0
|
![]() |
||||||
06.05.2015, 10:46 | ||||||
Я говорю следующее.
Сколько раз в секунду вызывается эта функция при пошаговой отладке?
Окно генерирует много событий и их все нужно объять из очереди, иначе операционная система "считает" что программа зависла. Запустите этот код и посмотрите насколько часто и в каких случаях появляются события.
Дайте ссылку на MSDN (документацию) от майкрософт где написано что должно быть именно так. По видимому умные дядьки-программисты из майкрософта с вами не согласны.
0
|
06.05.2015, 10:46 | ||||||
Помогаю со студенческими работами здесь
20
Казалось бы, эквивалентные if, но один работает, а второй нет Не строит как должен, или делаю что-то не так? Объект перемещается не так как должен - подскажите где ошибка Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. )
В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
|
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
|
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
|
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
|
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
|
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
|
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
|
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
|
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
|
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
|