Околоотладочная тема и выпуск пара
|
|
laser | Дата: Среда, 13.04.2022, 12:52 | Сообщение # 91 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| Цитата zamabuvaraeu ( ) Ничего подобного. Так называемую строку кода, где произошёл сбой, найти легко без всяких исключений и Oп Eггог. Скажи в этой проге в какой строке произошла ошибка?
Цитата zamabuvaraeu ( ) что эта библиотека обязательно должна быть написана на фрибесике Библа должна быть стандартной и отлаженной. Нужно по сети сырой трафик (TCP/UDP) поганять что в FB кроссплатформенное для этого есть? В справке не нашел.
|
|
| |
zamabuvaraeu | Дата: Среда, 13.04.2022, 18:25 | Сообщение # 92 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| 1. Давайте вы не будете отправлять скришноты в стиле «У меня табличка вылезла, почините», а скажете при каких действиях возникла эта ошибка.
2. Почему должна быть стандартной? Вызов функции из стандартной библиотеки равноценен вызову из нестандартной. Есть какие‐то объективные причины? Простой пример. Вот в языке Си в стандартной библиотеке нет GUI да и сама библиотека слабенькая, тем не менее, на этом языке написано множество кроссплатформенных программ. Ваша идея‐фикс о вызовах функции из нестандартной библиотеки чем‐то хуже, мне непонятна.
Про отлаженность: window9 достаточно отлаженная библиотека чтобы её использовать.
3. Ну а в PureBasic кроссплатформенная сеть из‐за своей модели активного ожидания жрёт вхолостую процессорное время и вообще не имеет права применяться в живых проектах.
|
|
| |
laser | Дата: Среда, 13.04.2022, 19:16 | Сообщение # 93 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| Цитата zamabuvaraeu ( ) скажете при каких действиях возникла эта ошибка. Запустил exe и сразу вылет. В какой строке исходника баг? Имя файла исходника тоже назовите.
Цитата zamabuvaraeu ( ) Вызов функции из стандартной библиотеки равноценен вызову из нестандартной. Разница в ответственности разроба библы. Сторонние разробы (сообщество) часто безответственны и в библе полная каша и баг на баге, которые обычно не фиксят, типа библа с сырцами - сам пофиксишь. В этом большая разница между халявными и коммерческими продуктами. Разработчики последних относятся с большей ответственностью к продуктам, т. к. от их качества напрямую зависит доход. А разробы бесплатного ПО ничего никому не должны.
Цитата zamabuvaraeu ( ) Вот в языке Си в стандартной библиотеке нет GUI Тебе нада объяснять почему? Реально не врубаешься что в момент появления сей и его библы были времена DOS и о GUI тока мечтали! Поэтому файлы, консоль и прочие атрибуты доса в сишной библе есть, а многое из винды и линя нет.
Цитата zamabuvaraeu ( ) на этом языке написано множество кроссплатформенных программ. Они наверно на плюсах писаны а не на чистой сишке, ну да ладно, не суть. На Qt можно сворганить кроссатформенную прогу, тока ты охиреешь от размера в несколько десятков метров у простой форточки! Это цена кроспплатформы на сях!
Цитата zamabuvaraeu ( ) Ваша идея‐фикс о вызовах функции из нестандартной библиотеки чем‐то хуже, мне непонятна. Почти у всех нестандартных библ (фришных) нет нормальной документации, бардак в коде и именовании объектов, баги которые не всегда правят, и никто никому ничего не должен. Спасибо, но это го*но мне не надо. Мне нужно разрабатывать быстро и качественно, а не догадываться о работе функций библы по их коду попутно фикся баги.
Цитата zamabuvaraeu ( ) Про отлаженность: window9 достаточно отлаженная библиотека чтобы её использовать. Не юзал и ничего о ней сказать не могу... Но функций в ней маловато. Даже до PB 15-ти летней давности не дотягивает. К примеру в библе есть Packer но там тупая упаковка/распаковка через zlib.lib. Сравни с тем что может PB https://www.purebasic.com/documentation/packer/index.html А он может открывать/создавать ZIP, 7z, TAR и др. архивы. Разницу осознаешь? Кроссплатформа под вопросом. Сырков на нашел. В сборке компиля FB тока заголовочник и статическая библа.
Цитата zamabuvaraeu ( ) Ну а в PureBasic кроссплатформенная сеть из‐за своей модели активного ожидания жрёт вхолостую процессорное время Ничего она не жрет если руки с правильного места растут. На 1000 активных коннектов загрузка проца меньше процента. Прикол в том что в FB даже такой нет. На винде напишешь на API, а если понадобится перенести на другие платформы наступит облом! Вот так всегда с FB.
|
|
| |
zamabuvaraeu | Дата: Среда, 13.04.2022, 20:09 | Сообщение # 94 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Цитата laser ( ) Запустил exe и сразу вылет. В какой строке исходника баг? Во второй строке идёт отображение окна, вылет происходит до отображения окна, следовательно, сбоит первая строка.
Расскажите, что вы будете делать дальше, когда вы узнали номер строки и имя файла. Отправите тётеньке‐бухгалтеру отладчик, чтобы она посмотрела стэк вызовов и регистры процессора?
Цитата laser ( ) бардак в коде и именовании объектов Особенно этот бардак заметен в языке PureBasic, где одна часть языка противоречит другой (например, Get против его отсутствия), или доступ к полям структур вместо точки используется слэш.
Цитата laser ( ) Ничего она не жрет если руки с правильного места растут. На 1000 активных коннектов загрузка проца меньше процента. Извините, но нет. Сеть должна нагружать процессор только в момент поступления или отправки данных. А если процессор хоть один такт тратит на проверку наличия данных — это хрестоматийный пример «как не надо делать», антипаттерн программирования, у которого есть отдельная статья в педивикии. Могли бы сделать асинхронные сокеты.
|
|
| |
laser | Дата: Среда, 13.04.2022, 20:41 | Сообщение # 95 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| Цитата zamabuvaraeu ( ) Во второй строке идёт отображение окна, вылет происходит до отображения окна, следовательно, сбоит первая строка. Садись двойка! Вторая строка пустая, а вылет в 24 строке.
Цитата zamabuvaraeu ( ) Расскажите, что вы будете делать дальше, когда вы узнали номер строки и имя файла. Я знаю где споткнулась прога, оттуда и начинаю поиск бага. Это весомая зацепка, значительно сужающая место поиска. Нужно просмотреть не несколько тысяч (или десятков тысяч) а 10 - 100 строк. Разница очевидна не так ли?
Цитата zamabuvaraeu ( ) Отправите тётеньке‐бухгалтеру отладчик, чтобы она посмотрела стэк вызовов и регистры процессора? Стек вызовов пригодился бы, а от регистров CPU толку мало. Я ж не на асме пишу, а ЯВУ их юзает по своему усмотрению.
Цитата zamabuvaraeu ( ) Особенно этот бардак заметен в языке PureBasic, где одна часть языка противоречит другой (например, Get против его отсутствия), или доступ к полям структур вместо точки используется слэш. Да ниче там не противоречит. Обычно нет Get тогда когда Set быть не может. Ты еще мелкософофту выкати предъяву за функцию SysStringLen и многие другие. Она возвращает длину строки, но где GET? Иди катай предъяву!
Цитата zamabuvaraeu ( ) Сеть должна нагружать процессор только в момент поступления или отправки данных. В WinAPI сеть устроена примерно как в PB. Иди катай предъяву мелкософту!
Цитата zamabuvaraeu ( ) А если процессор хоть один такт тратит на проверку наличия данных — это хрестоматийный пример «как не надо делать» Проверки по любому будут, тока вся разница скрыты они или видны. Ты еще повозмущайся что почти все WinAPI в конечном итоге переходят в ядро с соответствующими накладными расходами. Поверь, один такт на проверку сети это микроскопическая капелька в огромном океане по сравнению с тем сколько ресурсов жрет система!
Ты функцию InternetReadFile видел? То сих пор не обхаял мелкомягких за то что в имени нет GET и сокеты не асинхронные?
|
|
| |
haav | Дата: Среда, 13.04.2022, 22:09 | Сообщение # 96 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Откуда такая тяга в консоли? Чат логичнее делать в GUI. Обоснуй в чем преимущество консоли для всех без исключения прог?
До линукса консоль почти не использовал и мысли были такие же как у тебя. Сейчас мое мнение изменилось. Что касается причин или преимуществ... как минимум консольные программы работают независимо от того , на какой TTY консоли запущена (X Window System или чистая консоль). Так же консольные команды потокобезопасны и просты в использовании. Вообще тебе лучше спросить у проф. программистов , почему они например предпочитают консольный VIM вместо какого-нибудь гуишного IDE. Или почему продвинутые пользователи линукса используют терминал с консольными программами вместо гуишного ФМ. Или почему реверсеры гораздо чаще используют консольный HIEW , а не гуишный IDA , хотя второй тоже используют когда нужен "танк". Пока ты или я тыкаемся мышью в ярлык , по кнопкам и пр. прибамбасам , юзер линукса уже получит нужный результат с помощью горячих клавиш , быстрого ввода с автодополнением. Я сам потихоньку втягиваюсь в консольный мир. Некоторые задачи уже давно делаю только в консоли , просто это гораздо быстрее. Но привычки виндузятника так просто не сломать
Цитата У FB компиль поинтереснее, но с IDE, отладчиком и кросс-библой фигня полная!
Вот перечень редакторов и IDE для FB: https://www.freebasic.net/forum/viewtopic.php?t=28347 И это еще не полный перечень. Как минимум я помню еще о трех: Geany , Rqwork , FireFly
Если с головой все в порядке , то GDB вполне подойдет для отладки. Но для новичка возможно будет туговато.
Про кросс библиотеки , просто достаточно посмотреть заголовки в папке компилятора. Для малораспространенных библиотек разрабы FB заголовков не кладут. Найти скомпиленные либы можно или на крайний случай самому собрать. Это делается один раз и потом только пользуйся.
Цитата laser ( ) Разница в ответственности разроба библы. Сторонние разробы (сообщество) часто безответственны и в библе полная каша и баг на баге, которые обычно не фиксят, типа библа с сырцами - сам пофиксишь. В этом большая разница между халявными и коммерческими продуктами. Разработчики последних относятся с большей ответственностью к продуктам, т. к. от их качества напрямую зависит доход. А разробы бесплатного ПО ничего никому не должны.
Ты боишься использовать СПО , хотя Фред сам не гнушается свободными либами и строит на основе их свои функции , обертками которых ты пользуешься
Цитата laser ( ) Прикол в том что в FB даже такой нет. На винде напишешь на API, а если понадобится перенести на другие платформы наступит облом! Вот так всегда с FB.
Ну это ерунда. У линукса так же есть функции для работы с сокетами.
Цитата laser ( ) На Qt можно сворганить кроссатформенную прогу, тока ты охиреешь от размера в несколько десятков метров у простой форточки! Это цена кроспплатформы на сях!
Для конечной серьезной программы размер нивелируется. А вообще в 2022 году никто не считает метры программ.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
laser | Дата: Среда, 13.04.2022, 23:40 | Сообщение # 97 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| Цитата haav ( ) Вообще тебе лучше спросить у проф. программистов , почему они например предпочитают консольный VIM вместо какого-нибудь гуишного IDE. Закоренелые линуксоиды и не на такое способны...
Цитата haav ( ) Пока ты или я тыкаемся мышью в ярлык , по кнопкам и пр. прибамбасам , юзер линукса уже получит нужный результат с помощью горячих клавиш , быстрого ввода с автодополнением. Не нужно преувеличивать.
Цитата haav ( ) Некоторые задачи уже давно делаю только в консоли , просто это гораздо быстрее. Все равно непонятно в чем преимущество консольного софта. Не системного, а того что ты пишешь. Больше похоже на то что в лине нет стандартного GUI (в зависимости от дистрибутива может быть gtk2, gtk3, qt и др.) и чтобы гарантировано работало юзают консоль. У винды и мака в этом плане преимущество.
Цитата haav ( ) Если с головой все в порядке , то GDB вполне подойдет для отладки. Предлагаешь вводить команды в консоль GDB? Не очень удобно и затратно по времени... Прикручивание к IDE куда интереснее.
Цитата haav ( ) Про кросс библиотеки , просто достаточно посмотреть заголовки в папке компилятора. Понимаешь какое дело - в папке куча файла и по имени файла не всегда очевидно для чего оно. Чтобы найти библу нужно перелопатить кучу файла, а когда найдешь, поискать нормальную доку желательно на русском. Это не очень быстро... Для хобби может и сойдет когда не спешишь и можно простой проект растянуть на несколько лет, но для работы - нерациональное расходование времени и сил.
Цитата haav ( ) хотя Фред сам не гнушается свободными либами и строит на основе их свои функции Верно, но эти библы его зона ответственности. Прежде чем внедрить в PB, он их хорошо тестирует. Если в дальнейшем выявляются баги, он их ищет и правит.
Цитата haav ( ) Ну это ерунда. У линукса так же есть функции для работы с сокетами. Есть, не спорю, но они отличаются от тех что в винде. То есть нужно писать отдельно код для винды и отдельно для линя формируя общие функции - обвертки. В PB это доступно изкаропки.
Цитата haav ( ) Для конечной серьезной программы размер нивелируется. Серьезную прогу редко пишут в одиночку. Мы же обсуждаем небольшие проекты.
Цитата haav ( ) А вообще в 2022 году никто не считает метры программ. zamabuvaraeu, считает https://www.cyberforum.ru/pure-basic/thread410028.html#post15887940 https://www.cyberforum.ru/basic/thread2809308-page14.html#post15419783
Он необоснованно усложняет код, избегая рантайма и библ, ради нескольких КБ тратя на это время...
|
|
| |
zamabuvaraeu | Дата: Четверг, 14.04.2022, 07:09 | Сообщение # 98 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Цитата laser ( ) Это весомая зацепка, значительно сужающая место поиска. Нужно просмотреть не несколько тысяч (или десятков тысяч) а 10 - 100 строк. Разница очевидна не так ли? Вам пришло вам какое‐нибудь NULL или висячая ссылка на объект. Или в каком‐то неизвестном месте кода идёт утечка дескрипторов, количество которых в системе ограничено (GDI), а в той строке что вам показала тётенька‐бухгалтер, запустив отладчик на офисном компьютере, параллельно ковыряясь в одинэске, просто сообщение «Не могу создать очередной объект».
Цитата laser ( ) Ты еще мелкософофту выкати предъяву за функцию SysStringLen и многие другие. Она возвращает длину строки, но где GET? Иди катай предъяву! Это значит лишь то, что создатели PureBasic решили повторить дурной пример и сделать тяп‐ляп. Тем временем, корпорация Микрософт ещё в 2001 году одумалась и выкатила ДотНетФреймвёрк, приведённый к единому стилю Naming Convention. Вы бы ещё в пример стандартную библиотеку Си привели, где тысячи трёхбуквенных сокращений, сами же говорили, что разрабатывалась с волосатых годов.
Цитата laser ( ) В WinAPI сеть устроена примерно как в PB. Неверно. В винапи есть асинхронные сокеты. Где это в пуребесике?
Цитата laser ( ) Проверки по любому будут, тока вся разница скрыты они или видны. Опять неверно. Говорите системе «А у прочитай мне этот сокет в асинхронном режиме, вот буфер для данных». Система говорит «Окей, запрос поставлен в очередь». Дальше вы продолжаете работу и делаете полезные дела, например, обрабатываете сообщения GUI. В тот момент когда на сетевую карту приходят данные (на сетевой карте свой процессор, он работает параллельно и независимо), данные сразу пишутся в предоставленный вами буфер, потом сетевая карта вызывает прерывание процессора, процессор вызывает обработчик прерываний, обработчик прерываний уведомляет систему, что данные пришли и записаны в буфер. Затем система уведомляет вас, что асинхронная операция чтения завершена, вы обрабатываете данные и цикл повторяется. Здесь нет никаких проверок каждые N миллисекунд «пришли ли данные», не нужно по таймеру или в цикле опрашивать сеть.Добавлено (14.04.2022, 07:18) ---------------------------------------------
Цитата laser ( ) Предлагаешь вводить команды в консоль GDB? Не очень удобно и затратно по времени... Нет, нажатие Enter = повтор ранее введённой команды. Это столько же действий, что нажимать F8 в отладчике пуребесика. К тому же команды можно прокручивать по списку через стрелочки вверх ↑ и вниз ↓. Не увидел никакой автоматизации отладки в пуребесике. Пуребесик вообще точки останова сохранять умеет? Или при перезагрузке IDE точки останова приходится расставлять заново?Добавлено (14.04.2022, 07:22) ---------------------------------------------
Цитата laser ( ) Он необоснованно усложняет код, избегая рантайма и библ, ради нескольких КБ тратя на это время... Вы смотрите на исходный код, чтобы можно было однострочником написать всю программу. Но меня интересует результат, а результат — это маленькие программы в пару килобайт.
|
|
| |
haav | Дата: Четверг, 14.04.2022, 07:46 | Сообщение # 99 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата laser ( ) Все равно непонятно в чем преимущество консольного софта. Не системного, а того что ты пишешь.
Так я и системный пишу. Зато , если по каким-то причинам грохнутся иксы , я перейду в чистую консоль и могу так же пользоваться. Например htop (уточняю: не моя) - отличная программа, работает везде и очень шустрая.
Цитата laser ( ) Предлагаешь вводить команды в консоль GDB? Не очень удобно и затратно по времени...
Не вижу ничего плохого для тех кто так привык. Но лично я уже показал , как я использую GDB. Все самое "жизненно-важное" в моей утили есть , на x86-64 работает нормально. С x86 есть как минимум одна проблема и я о ней писал здесь: http://freebasic.ucoz.com/forum/22-524-2481-16-1638777144 Но я не парюсь по этому поводу. 32-bit системы уходят в прошлое. Да и пользователю FB все таки правильнее создавать переменные примерно таким способом: Dim tA as A , а не таким Dim A as A. Тогда GDB на 32-bit все правильно проглотит.
Цитата laser ( ) Понимаешь какое дело - в папке куча файла и по имени файла не всегда очевидно для чего оно.
На самом деле это я к слову сказал , всегда можно почитать вики: https://www.freebasic.net/wiki/ExtLibTOC . В справке это тоже есть , если что.
Цитата laser ( ) Есть, не спорю, но они отличаются от тех что в винде. То есть нужно писать отдельно код для винды и отдельно для линя формируя общие функции - обвертки. В PB это доступно изкаропки.
У меня всегда есть наработки для разных задач не свои, так чужие. Это пишется один раз и потом используется , с необходимыми корректировками (если это необходимо). Так что для меня "из коробки" ничего не значит. Хотя я приветствую , если разрабы компилей добавляют что-то , что для новичков облегчит жизнь.
Цитата laser ( )
Это его личное мнение и его личное желание. Он придерживается такой идеологии программирования , значит видит в ней ценность. Скрупулезность - довольно не плохое качество.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
laser | Дата: Четверг, 14.04.2022, 16:33 | Сообщение # 100 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| Цитата zamabuvaraeu ( ) Вам пришло вам какое‐нибудь NULL или висячая ссылка на объект. Буду разбираться с этим. Почему пришел 0 и почему в коде нет соответствующих проверок. Вы вообще не узнаете в каком месте проги ошибка.
Цитата zamabuvaraeu ( ) Это значит лишь то, что создатели PureBasic решили повторить дурной пример и сделать тяп‐ляп. Все вокруг тупые, а один ты умный? Это повод проконсультироваться у психиатра!
Цитата zamabuvaraeu ( ) ем временем, корпорация Микрософт ещё в 2001 году одумалась и выкатила ДотНетФреймвёрк, приведённый к единому стилю Naming Convention. Фигню выкатила. Нет нормальной совместимости с предыдущими версиями. Если на комп поставить нет4, это не значит что проги на нет1, нет2, нет3 и их под версиями будут работать. Предлагаешь ставить больше десятка разных нет-рантаймов? exe относительно легко декомпилится. WinAPI в этом плане гораздо лучше и совместимее, включая вызов из почти всех ЯП (по факту - вызов функций из dll), не то что .NET.
Цитата zamabuvaraeu ( ) Вы бы ещё в пример стандартную библиотеку Си привели, где тысячи трёхбуквенных сокращений, сами же говорили, что разрабатывалась с волосатых годов. PB тоже не первый год разрабатывается. Ему больше 20 лет.
Цитата zamabuvaraeu ( ) В винапи есть асинхронные сокеты. Где это в пуребесике? В лине и маке есть асинхронные сокеты в таком же виде как в винде? Не думал что совместимость играет не последнюю роль? Еще раз повторяю, если руки откуда надо растут, даже тысячи соединений на нагружают проц.
Цитата zamabuvaraeu ( ) В тот момент когда на сетевую карту приходят данные (на сетевой карте свой процессор, он работает параллельно и независимо), данные сразу пишутся в предоставленный вами буфер Не так. Данные пишутся в буфер выделенный в ядре из не подкачиваемого пула. Когда было определено какому приложению отправить данные и в какой сокет, тока тогда данные копируются из буфера ядра в юзермодную память. События прилетают в окно? Или в цикле ждешь их появления? В одном и другом случае по разным причинам возможны утечки памяти.
Цитата zamabuvaraeu ( ) Здесь нет никаких проверок каждые N миллисекунд «пришли ли данные» Вообще-то не нужно так часто проверять. Проверки могут быть адаптивными - чем больше поток данных, тем чаще проверка.
Цитата zamabuvaraeu ( ) не нужно по таймеру или в цикле опрашивать сеть. Покажи мастер-класс - пример асинхронных сокетов на лине и маке. Тока думаю сейчас опять сольешься как в случае с OnError.
Цитата zamabuvaraeu ( ) Пуребесик вообще точки останова сохранять умеет? Зачем? Обычно их несколько в небольшом участке кода. Никто в здравом уме не ставит сотни бряков по всему коду.
Цитата zamabuvaraeu ( ) Но меня интересует результат, а результат — это маленькие программы в пару килобайт. А нахрена? Винт на 10 МБ?
Цитата haav ( ) если по каким-то причинам грохнутся иксы , я перейду в чистую консоль и могу так же пользоваться. Это чиста линускоидная заморочка. В винде и маке этих проблем нет.
Цитата haav ( ) Не вижу ничего плохого для тех кто так привык. 1. Это больше пары кликов мышки, а значит дольше. 2. Команды нужно знать (решаемо). 3. Это менее удобно. 4. Надо помнить имена переменных если хочешь посмотреть конкретную из них. Сопровождая одновременно десятки проектов это будет проблемой.
|
|
| |
zamabuvaraeu | Дата: Четверг, 14.04.2022, 19:08 | Сообщение # 101 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Цитата laser ( ) В лине и маке есть асинхронные сокеты в таком же виде как в винде? А в лине и маке есть такое же GUI как винде? Почему‐то создатели пуребесика смогли сделать единый набор буребесиковых функций, под которым скрываются разные апи операционных систем для разного вида GUI. Неужели асинхронные сокеты — это такая сложная задача?
Цитата laser ( ) Еще раз повторяю, если руки откуда надо растут, даже тысячи соединений на нагружают проц. Нагружают, потому что есть проверка на наличие данных.
Цитата laser ( ) Вообще-то не нужно так часто проверять. Проверки могут быть адаптивными - чем больше поток данных, тем чаще проверка. 100 миллисекунд — это часто? То есть нужно реже, например, два раза в секунду? Вот в MMORPG игре пользователь щёлкнул мышью и отдал команду персонажу «стрелять». Вы считаете нормальной ситуацию, когда онлайн игра целых полсекунды «висит» и не реагирует (даже больше полсекунды, потому что задержка на проверку на сервере на пришедшие данные + задержка на проверку на клиенте)?
Нормальные приложения не нуждаются в проверках, принимают данные асинхронно и потому не подвержены задержкам реагирования этого типа.
Цитата laser ( ) Данные пишутся в буфер выделенный в ядре из не подкачиваемого пула. В винде для синхронных и асинхронных сокетов: когда запущена операция чтения до того как придут данные, то есть пользователь предоставил буфер и данные ещё не пришли, то когда они придут, то будут записаны сразу в пользовательский буфер. Без копирований в буфер ядра. На неблокирующих сокетах, модели которых придерживается пуребесик, данные конечно же будут копироваться из буфера ядра в пользовательский буфер. Поэтому неблокирующий режим — неэффективен и жрёт процессорное время холостыми проверками, когда данных нет. Можно было бы обойтись блокирующим сокетом в отдельном потоке, что несколько хуже, но блокирующая модель недоступна в пуребесике.
Цитата laser ( ) Покажи мастер-класс - пример асинхронных сокетов на лине и маке. Во‐первых, Я последую вашему примеру и не буду предоставлять свой код, во‐вторых, не хочу исправлять код коммерческого продукта бесплатно.
Цитата laser ( ) События прилетают в окно? Или в цикле ждешь их появления? Я не использую оконные уведомления на сокете. Корпорация Микрософт объявила WSAAsyncSelect устаревшим и рекомендовала не использовать.
Для окон: сокет с флагом WSA_FLAG_OVERLAPPED, WSARecv-WSASend + OVERLAPPED, процедуры завершения и MsgWaitForMultipleObjectsEx. Если вам не нравятся процедуры завершения, тогда WSAGetOverlappedResult.
Для неокон использую пул потоков: CreateIoCompletionPort, GetQueuedCompletionStatus, WSARecv-WSASend + OVERLAPPED.
Цитата laser ( ) В одном и другом случае по разным причинам возможны утечки памяти. Я не думаю, что с пуребесиком это большая проблема. Как вы сами сказали, отладчик покажет имя файла и номер строки, где произошла ошибка.
Цитата laser ( ) Зачем? Обычно их несколько в небольшом участке кода. Никто в здравом уме не ставит сотни бряков по всему коду Перезапаустил IDE, точки заново расставлять? Или чтобы завтра продолжить отлаживать программу в том же месте. Мне на листочек записывать номер строки, что ли, чтобы не забыть где была точка.Добавлено (14.04.2022, 19:10) ---------------------------------------------
Цитата laser ( ) В лине и маке есть асинхронные сокеты в таком же виде как в винде? Вот в языке программирования PYTHON смогли же сделать кроссплатформенные асинхронные сокеты. Значит, это возможно.
|
|
| |
laser | Дата: Четверг, 14.04.2022, 21:39 | Сообщение # 102 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| Цитата zamabuvaraeu ( ) А в лине и маке есть такое же GUI как винде? ГУЙня есть но не такая. Вообще не такая с программной точки зрения как на винде.
Цитата zamabuvaraeu ( ) Неужели асинхронные сокеты — это такая сложная задача? Напиши сетевую кросс библу для FB на асинхронных сокетах и узнаешь. Заодно для PB появится нормальная и правильная сетевая библа для винды и линя (FB больше ничего не поддерживает).
Цитата zamabuvaraeu ( ) Нагружают, потому что есть проверка на наличие данных. На асинхронных сокетах тоже есть, тока она в ядре и не знаешь о ней.
Цитата zamabuvaraeu ( ) 100 миллисекунд — это часто? Смотря как часто данные идут. Если раз в час несколько КБ, это часто и можно проверять гораздо реже.
Цитата zamabuvaraeu ( ) Вот в MMORPG игре пользователь щёлкнул мышью и отдал команду персонажу «стрелять» В игре всем рулит сервер. А клиент устанавливает тока одно двунаправленное соединение с ним. Опрос одного сокета каждые 10 мс. не нагрузит проц больше чем на 0.01%. Ты не заметишь этого на фоне общей загрузки компа игрой.
Цитата zamabuvaraeu ( ) то есть пользователь предоставил буфер и данные ещё не пришли, то когда они придут, то будут записаны сразу в пользовательский буфер. Без копирований в буфер ядра. Этого быть не может. Сеть может быть через интерфейсы WiFi, lan, modem и др. Плюс куча прослоек https://ru.wikipedia.org/wiki....%B8_OSI Сначала данные копируются в буфер ядра, потом разбираются пакеты, выясняется что откуда было прислано и кто запрашивал и тока когда будет выяснено кому отдать данные, они копируются в юзермод память.
Цитата zamabuvaraeu ( ) Можно было бы обойтись блокирующим сокетом в отдельном потоке, что несколько хуже, но блокирующая модель недоступна в пуребесике. С чего ты решил что недоступна?
Цитата zamabuvaraeu ( ) Я последую вашему примеру и не буду предоставлять свой код, во‐вторых, не хочу исправлять код коммерческого продукта бесплатно. Пиши на FB. Я его все равно не юзаю. Сделаешь ценный вклад в развитие кроссплатформы FB.
Цитата zamabuvaraeu ( ) Я не использую оконные уведомления на сокете. Тогда как получаешь события приема из сети? Функции MsgWaitForMultipleObjectsEx и WSAGetOverlappedResult требуют периодического вызова, т. е. также как в PB. Тогда в чем преимущество асинхронных сокетов?
Цитата zamabuvaraeu ( ) Я не думаю, что с пуребесиком это большая проблема. Причем здесь PB? Я про асинхронные сокеты писал.
Цитата zamabuvaraeu ( ) Перезапаустил IDE, точки заново расставлять? Уже ответил на этот вопрос.
|
|
| |
haav | Дата: Пятница, 15.04.2022, 09:43 | Сообщение # 103 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата laser ( ) Напиши сетевую кросс библу для FB на асинхронных сокетах и узнаешь. Заодно для PB появится нормальная и правильная сетевая библа для винды и линя (FB больше ничего не поддерживает).
Кому надо , тот еще лет 10 назад использовал FB на ARM и на макоси. На сегодня ARM-linux официально поддерживается , как и freebsd. Кто-то даже на любительской колибри ос гонял FB Практически все старые пользователи на этом форуме об этом знают. Кого ты тут пытаешься убедить , непонятно.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Пятница, 15.04.2022, 10:45 | Сообщение # 104 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Цитата laser ( ) На асинхронных сокетах тоже есть, тока она в ядре и не знаешь о ней. Нет. Если бы там была проверка раз в N миллисекунд, это сразу было бы видно в диспетчере задач, что какое‐то ядро процессора занятно.
Цитата laser ( ) Если раз в час несколько КБ, это часто и можно проверять гораздо реже. Активное ожидание — это антипаттерн программирования. Это образцовый пример как не надо делать. Но вы продолжаете придерживаться этой дурной практики, зачем‐то её оправдываете и просто не понимаете, почему это плохо. Наверное потому, что в пуребесике по‐другому с сетью работать нельзя.
Цитата laser ( ) С чего ты решил что недоступна? Тот пример с сервером что из справки, загрузил мой процессор на 100% своим бесконечным циклом. Приведите пример, где пуребесик использует сокет в блокирующем режиме. В справке только неблокирующий режим.
Цитата laser ( ) Функции MsgWaitForMultipleObjectsEx и WSAGetOverlappedResult требуют периодического вызова, т. е. также как в PB. Тогда в чем преимущество асинхронных сокетов? Преимущество здесь в том, что поток блокируется на функции MsgWaitForMultipleObjectsEx. Поток спит и не проверяет есть ли данные в сети. Поток просыпается в двух случаях: когда завершаются асинхронные процедуры или когда сообщение добавляется в очередь. Пример кода (лорем ипсум удалён):
Код Do ' Ждём, когда выполнятся процедуры завершения ' или сообщение будет добавлено в очередь Dim dwWaitResult As DWORD = MsgWaitForMultipleObjectsEx( параметры ) Select Case dwWaitResult Case WAIT_OBJECT_0 + 1 ' Обрабатываем сообщения из очереди ' это обычный стандартный цикл выборки сообщений ' ничего сверхъестественного GetMessage() или PeakMessage() что больше нравится TranslateMessage() DispatchMessage() Case Else ' Обработку остальных возвращаемых значений функции MsgWaitForMultipleObjectsEx ' Оставляю в качестве домашнего задания End Select Loop
Цитата laser ( ) Тогда как получаешь события приема из сети? Я использую процедуры завершения. Функция, которая запускает чтение данных на сокете:
Код ' Где‐то ранее в коде инициализации: pRecvOverlapped = Allocate(SizeOf(WSAOVERLAPPED)) pBuffer = Allocate(количество байт)
Function StartRecvOverlapped( _ параметры на ваше усмотрение _ )As Boolean ' Также вам нужно иметь буфер, куда данные будут записаны ' Этот буфер нельзя удалять или изменять его содержимое до того ' как операция чтения будет завершена ' Вам будет нужен экземпляр структуры WSAOVERLAPPED ' или что‐нибудь унаследованное от неё ' Для каждой операции чтения или записи нужен свой отдельный экземпляр WSAOVERLAPPED ' Разные экземпляры WSAOVERLAPPED нельзя смешивать ' Нельзя пытаться использовать уже занятую WSAOVERLAPPED в другой операции ' Обнуляем OVERLAPPED перед началом ZeroMemory(pRecvOverlapped, SizeOf(WSAOVERLAPPED)) Dim Flags As DWORD = 0 Dim res As Long = WSARecv( _ сокет, _ WSAбуферы куда данные будут записаны, _ количество буферов, _ NULL, _ @Flags, _ pRecvOverlapped, _ @ReceiveCompletionROUTINE _ ← указатель на процедуру завершения ) If res <> 0 Then res = WSAGetLastError() If res <> WSA_IO_PENDING Then ' Ошибка, какая именно ищите в описании кодов ошибок WSA Return False End If End If ' Всё хорошо, операция чтения добавлена в очередь Return True End Function
Процедура завершения. Эту функцию вызывает операционная система, когда данные записаны в буфер:
Код Sub ReceiveCompletionROUTINE( _ ByVal dwError As DWORD, _ ← код ошибки ByVal cbTransferred As DWORD, _ ← сколько данных пришло ByVal lpOverlapped As LPWSAOVERLAPPED, _ ← указатель на WSAOVERLAPPED которую вы отправляли при запуске операции чтения ByVal dwFlags As DWORD _ ← флаги, не используются ) ' Если вы отправляли объект, унаследованный от WSAOVERLAPPED ' тут вы его можете получить обратно Dim Объект As Объект Ptr = CPtr(Объект Ptr, lpOverlapped) If dwError <> 0 Then ' Ошибка чтения, сокет можно закрывать Exit Sub End If ' Теперь вы можете работать с буфером, менять его содержимое или удалять ' Учитывайте, что данные могут прийти частично ' Например, вы запросили 2 гигабайта, а получили только 1 байт ' Поэтому ваш буфер должен быть накопительным ' Вам также может прийти 0 байт, это значит, что другая сторона закрыла соединение ' Вам нужно поступить также: вызвать shutdown и closesocket ' Это не ошибка, просто достигнут «конец файла» ' Впрочем, для тех кто использует сокеты это никакой не секрет ' pBuffer ' Запускаете операцию чтения снова Dim hr As Boolean = StartRecvOverlapped(параметры) If hr = False Then ' Ошибка запуска операции чтения End If End Sub
Как видите, в этом коде нет проверок «по таймеру» или каждые N миллисекунд.Добавлено (15.04.2022, 10:48) --------------------------------------------- Для записи всё аналогично: готовим буфер с данными, свою OVERLAPPED, запускаем WSASend, отдельной процедуре получаем уведомление, что данные записаны в сокет.
|
|
| |
laser | Дата: Пятница, 15.04.2022, 11:54 | Сообщение # 105 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| Цитата haav ( ) еще лет 10 назад использовал FB на ARM и на макоси. И где скачать текущую версию FB для мака (Intel и ARM)? Если это неофициальная и не поддерживаемая версия, можно не считать. PB тоже есть для амиги и PowerPC проца, но больше не поддерживается и их не считаю.
Цитата haav ( ) На сегодня ARM-linux официально поддерживается , как и freebsd. Где скачать сборку (IDE, компиль, отладчик и др.) под ARM линь? У тебя на форуме тока сборки для винды. Опять все по принципу - сделай сам? В PB все собрано. В лине достаточно распаковать архив куда-то и установить требуемые пакеты.
Цитата zamabuvaraeu ( ) Если бы там была проверка раз в N миллисекунд, это сразу было бы видно в диспетчере задач Тут ты ошибаешься. Не все процессорное время в ядре можно посчитать по техническим причинам. Учитывается в основном юзермодное.
Цитата zamabuvaraeu ( ) Наверное потому, что в пуребесике по‐другому с сетью работать нельзя. Если нада тока для винды ничего не мешает писать на WinApi юзая "трушные" асинхронные сокеты, тока зачем? Чтобы сэкономить 0.0001% процессорного времени? Смысл? Думаешь шучу? Миллион вызовов NetworkClientEvent заняло 700 миллисекунд Код DisableDebugger InitNetwork() ConnectionID = OpenNetworkConnection("google.ru", 80) If ConnectionID t=ElapsedMilliseconds() For i=0 To 1000000 NetworkClientEvent(ConnectionID) Next MessageRequester("", Str(ElapsedMilliseconds()-t)) CloseNetworkConnection(ConnectionID) EndIf
То есть проверка наличия новых данных занимает меньше микросекунды. Не так часто нужно одновременно устанавливать тысячи соединений. Обычно одно или несколько. Их проверка вообще незаметна на фоне работы ОС и приложений. Что такое микросекунда каждую секунду? Это одна миллионная секунды! Это много меньше процента процессорого времени! Но код кроссплатформенный! Перенести свои асинхронные сокеты на линь или мак и посмотрим что у тебя получится.
Цитата zamabuvaraeu ( ) Тот пример с сервером что из справки, загрузил мой процессор на 100% своим бесконечным циклом. Это всего лишь пример. Добавь Delay(16) в цикл если текущее событие #PB_NetworkEvent_None и загрузка станет 0.
Цитата zamabuvaraeu ( ) Приведите пример, где пуребесик использует сокет в блокирующем режиме. Легко!Код InitNetwork() ConnectionID = OpenNetworkConnection("google.ru", 80) If ConnectionID ReceiveNetworkData(ConnectionID, @x, SizeOf(x)) CloseNetworkConnection(ConnectionID) EndIf
Прога повиснет в ReceiveNetworkData до приема заданного числа байт. Загрузка проца нулевая.
Цитата zamabuvaraeu ( ) Преимущество здесь в том, что поток блокируется на функции MsgWaitForMultipleObjectsEx. То есть предлагаешь останавливать поток до приема данных? Чем это лучше блокирующих сокетов? Надо 1000 соединений, создашь 1000 потоков? Браво! Верх оптимизации!
Цитата zamabuvaraeu ( ) Поток спит и не проверяет есть ли данные в сети. А вот с этим не соглашусь. Вероятно проверки есть в ядре. Ты не можешь на 100% это отрицать или видел код функции MsgWaitForMultipleObjectsEx и точно знаешь как она работает?
|
|
| |
|