FreeBasic
Главная
Вход
Регистрация
Четверг, 26.12.2024, 18:11Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 7 из 8
  • «
  • 1
  • 2
  • 5
  • 6
  • 7
  • 8
  • »
Околоотладочная тема и выпуск пара
laserДата: Среда, 13.04.2022, 12:52 | Сообщение # 91
Лейтенант
Группа: Пользователи
Сообщений: 57
Репутация: -46
Статус: Offline
Цитата zamabuvaraeu ()
Ничего подобного. Так называемую строку кода, где произошёл сбой, найти легко без всяких исключений и Oп Eггог.
Скажи в этой проге в какой строке произошла ошибка?


Цитата zamabuvaraeu ()
что эта библиотека обязательно должна быть написана на фрибесике
Библа должна быть стандартной и отлаженной.
Нужно по сети сырой трафик (TCP/UDP) поганять что в FB кроссплатформенное для этого есть? В справке не нашел.
Прикрепления: 1128536.png (50.4 Kb)
 
zamabuvaraeuДата: Среда, 13.04.2022, 18:25 | Сообщение # 92
Подполковник
Группа: Друзья
Сообщений: 149
Репутация: 5
Статус: Offline
1. Давайте вы не будете отправлять скришноты в стиле «У меня табличка вылезла, почините», а скажете при каких действиях возникла эта ошибка.

2. Почему должна быть стандартной? Вызов функции из стандартной библиотеки равноценен вызову из нестандартной. Есть какие‐то объективные причины?
Простой пример. Вот в языке Си в стандартной библиотеке нет GUI да и сама библиотека слабенькая, тем не менее, на этом языке написано множество кроссплатформенных программ.
Ваша идея‐фикс о вызовах функции из нестандартной библиотеки чем‐то хуже, мне непонятна.

Про отлаженность: window9 достаточно отлаженная библиотека чтобы её использовать.

3. Ну а в PureBasic кроссплатформенная сеть из‐за своей модели активного ожидания жрёт вхолостую процессорное время и вообще не имеет права применяться в живых проектах.
 
laserДата: Среда, 13.04.2022, 19:16 | Сообщение # 93
Лейтенант
Группа: Пользователи
Сообщений: 57
Репутация: -46
Статус: 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
Репутация: 5
Статус: Offline
Цитата laser ()
Запустил exe и сразу вылет. В какой строке исходника баг?
Во второй строке идёт отображение окна, вылет происходит до отображения окна, следовательно, сбоит первая строка.

Расскажите, что вы будете делать дальше, когда вы узнали номер строки и имя файла. Отправите тётеньке‐бухгалтеру отладчик, чтобы она посмотрела стэк вызовов и регистры процессора?

Цитата laser ()
бардак в коде и именовании объектов
Особенно этот бардак заметен в языке PureBasic, где одна часть языка противоречит другой (например, Get против его отсутствия), или  доступ к полям структур вместо точки используется слэш.

Цитата laser ()
Ничего она не жрет если руки с правильного места растут. На 1000 активных коннектов загрузка проца меньше процента.
Извините, но нет. Сеть должна нагружать процессор только в момент поступления или отправки данных. А если процессор хоть один такт тратит на проверку наличия данных — это хрестоматийный пример «как не надо делать», антипаттерн программирования, у которого есть отдельная статья в педивикии.
Могли бы сделать асинхронные сокеты.
 
laserДата: Среда, 13.04.2022, 20:41 | Сообщение # 95
Лейтенант
Группа: Пользователи
Сообщений: 57
Репутация: -46
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата
Откуда такая тяга в консоли? Чат логичнее делать в GUI.
Обоснуй в чем преимущество консоли для всех без исключения прог?


До линукса консоль почти не использовал и мысли были такие же как у тебя. Сейчас мое мнение изменилось. Что касается причин или преимуществ... как минимум консольные программы работают независимо от того , на какой TTY консоли запущена (X Window System или чистая консоль). Так же консольные команды потокобезопасны и просты в использовании. Вообще тебе лучше спросить у проф. программистов , почему они например предпочитают консольный VIM вместо какого-нибудь гуишного IDE. Или почему продвинутые пользователи линукса используют терминал с консольными программами вместо гуишного ФМ. Или почему реверсеры гораздо чаще используют консольный HIEW , а не гуишный IDA , хотя второй тоже используют когда нужен "танк". Пока ты или я тыкаемся мышью в ярлык , по кнопкам и пр. прибамбасам , юзер линукса уже получит нужный результат с помощью горячих клавиш , быстрого ввода с автодополнением. Я сам потихоньку втягиваюсь в консольный мир. Некоторые задачи уже давно делаю только в консоли , просто это гораздо быстрее. Но привычки виндузятника так просто не сломать smile

Цитата
У FB компиль поинтереснее, но с IDE, отладчиком и кросс-библой фигня полная!


Вот перечень редакторов и IDE для FB: https://www.freebasic.net/forum/viewtopic.php?t=28347
И это еще не полный перечень. Как минимум я помню еще о трех: Geany , Rqwork , FireFly

Если с головой все в порядке , то GDB вполне подойдет для отладки. Но для новичка возможно будет туговато.

Про кросс библиотеки , просто достаточно посмотреть заголовки в папке компилятора. Для малораспространенных библиотек разрабы FB заголовков не кладут. Найти скомпиленные либы можно или на крайний случай самому собрать. Это делается один раз и потом только пользуйся.

Цитата laser ()
Разница в ответственности разроба библы. Сторонние разробы (сообщество) часто безответственны и в библе полная каша и баг на баге, которые обычно не фиксят, типа библа с сырцами - сам пофиксишь.
В этом большая разница между халявными и коммерческими продуктами. Разработчики последних относятся с большей ответственностью к продуктам, т. к. от их качества напрямую зависит доход. А разробы бесплатного ПО ничего никому не должны.


Ты боишься использовать СПО , хотя Фред сам не гнушается свободными либами и строит на основе их свои функции , обертками которых ты пользуешься smile

Цитата laser ()
Прикол в том что в FB даже такой нет. На винде напишешь на API, а если понадобится перенести на другие платформы наступит облом! Вот так всегда с FB.


Ну это ерунда. У линукса так же есть функции для работы с сокетами.

Цитата laser ()
На Qt можно сворганить кроссатформенную прогу, тока ты охиреешь от размера в несколько десятков метров у простой форточки! Это цена кроспплатформы на сях!


Для конечной серьезной программы размер нивелируется. А вообще в 2022 году никто не считает метры программ.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
laserДата: Среда, 13.04.2022, 23:40 | Сообщение # 97
Лейтенант
Группа: Пользователи
Сообщений: 57
Репутация: -46
Статус: 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
Репутация: 5
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: 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 ()
zamabuvaraeu, считает https://www.cyberforum.ru/pure-basic/thread410028.html#post15887940
https://www.cyberforum.ru/basic/thread2809308-page14.html#post15419783

Он необоснованно усложняет код, избегая рантайма и библ, ради нескольких КБ тратя на это время...


Это его личное мнение и его личное желание. Он придерживается такой идеологии программирования , значит видит в ней ценность. Скрупулезность - довольно не плохое качество.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
laserДата: Четверг, 14.04.2022, 16:33 | Сообщение # 100
Лейтенант
Группа: Пользователи
Сообщений: 57
Репутация: -46
Статус: 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
Репутация: 5
Статус: 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
Репутация: -46
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата laser ()
Напиши сетевую кросс библу для FB на асинхронных сокетах и узнаешь. Заодно для PB появится нормальная и правильная сетевая библа для винды и линя (FB больше ничего не поддерживает).


Кому надо , тот еще лет 10 назад использовал FB на ARM и на макоси.
На сегодня ARM-linux официально поддерживается , как и freebsd.
Кто-то даже на любительской колибри ос гонял FB
Практически все старые пользователи на этом форуме об этом знают. Кого ты тут пытаешься убедить , непонятно.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
zamabuvaraeuДата: Пятница, 15.04.2022, 10:45 | Сообщение # 104
Подполковник
Группа: Друзья
Сообщений: 149
Репутация: 5
Статус: 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
Репутация: -46
Статус: 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 и точно знаешь как она работает?
 
  • Страница 7 из 8
  • «
  • 1
  • 2
  • 5
  • 6
  • 7
  • 8
  • »
Поиск: