Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/449: Рейтинг темы: голосов - 449, средняя оценка - 4.76
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782

Для чего нужны callback-функции

10.04.2009, 17:55. Показов 87546. Ответов 103
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для чего нужны callback-функции? И можно привести какой-нибуль пример по их использованию.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2009, 17:55
Ответы с готовыми решениями:

Для чего нужны указатели на функции?
для чего нужны эти указатели на функции... не проще ли вызвать саму функцию, чем заводить под нее указатель и им пользоваться...

Для чего нужны виртуальные функции и виртуальное наследование ?
Для чего нужны виртуальные функции и виртуальное наследование ? Я нашел не сколько статей но не все понял. Заранее спасибо!

Для чего нужны функции void, не возращающие никаких значений?
собственно сабж. выводить текст можно и без функции. а для чего делать что-то, что в дальнейшем и не пригодится в программе? #include...

103
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.06.2020, 13:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
fix:
Колбэк это кусок кода, который выполняется когда его вызывают
Это прогрессивный способ смотреть на то что я хотел сказать. По сути, идя по пути того, что конструктор это кусок кода, тут есть, что улучшить. Вот как это могло бы выглядеть поэтапно:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Колбэк это кусок кода, который выполняется по запуску объекта инкапсулирующего указатель на функцию, который в ходе исполнения можно переустанавливать.
Колбэк это кусок кода, который выполняется по запуску объекта
Колбэк это кусок кода, который выполняется
Колбэк это кусок кода
Колбэк это кусок
Ведь как не крути callback это call по сути своей. В меру жидкий, причём.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
31.08.2020, 18:24
Цитата Сообщение от Святогор Посмотреть сообщение
Всё же остался открытым вопрос какое преимущество дает возможность отправлять для одной функции аргумент являющийся другой функцией?
ну у wiki - это вроде не вопрос (раздел Достоинства и Недостатки)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.08.2020, 18:39
Цитата Сообщение от JeyCi Посмотреть сообщение
ну у wiki - это вроде не вопрос (раздел Достоинства и Недостатки)
У вики как у Вуки - глаза умные и всё. Хотя полезно конечно.
JeyCi, а вы как думаете, - что важнее, - расширение функционала парамеризацией на уровне типа, стратегии с параметризацией параметризации, организация сообщений между различными частями кода типа, - "Если произойдёт Это и будет утро - разбуди" или "Если произойдёт Это и будет вечер - принеси чашку тёплого молока" и т.п. ?
То есть, когда Исполнителю лучше и не знать, что ему предстоит сделать?
Мне кажется, что общего ответа нет. Поэтому вопрос похож на "Что такое хорошо?". По данной теме можно кучу конкретики обсуждать и места будет мало, (имхо).
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
31.08.2020, 20:26
из Достоинств мне понравился этот
— обычно для отслеживания операций или изменения параметров для следующей (вызываемой) функции. Таких независимых «дополнительных звеньев» в цепочке вызовов может быть сколько угодно.
из Несдостатков обратил моё внимание на себя этот
Уменьшение производительности, связанной с дополнительными вызовами «обратной функции», прямо пропорционально «стоимости вызова функции» в среде выполнения и количеству дополнительных вызовов при работе программы.
p.s.
gui сейчас коллбэками обрабатываю из вторичного потока в U++ (понятное дело с синхронизацией), а там же - во вторичный поток из gui что-то пока просигналить не могу событием смены флага остановки, чтобы его заметил метод объекта, работающего в этом вторичном потоке
Цитата Сообщение от IGPIGP Посмотреть сообщение
организация сообщений между различными частями кода типа,
типа ... - не всё так просто, как хотелось бы... на Qt не предлагайте переходить, пока с коллбэками и синхронизацией не разберусь...
утром была в deadlock'e... уже темнеет - вообще не знаю, где я
p.p.s

Не по теме:

и что-то InternetExplorer замучал меня на кибере - на каждой странице спрашивает, разрешить ли странице доступ к буферу копирования - и не надоел ему этот диалог со смной?

2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.08.2020, 20:51
Цитата Сообщение от JeyCi Посмотреть сообщение
типа ... - не всё так просто, как хотелось бы... на Qt не предлагайте переходить, пока с коллбэками и синхронизацией не разберусь...
Паттерн наблюдатель и без Кьюта живёт и здравствует.
Цитата Сообщение от JeyCi Посмотреть сообщение
— обычно для отслеживания операций или изменения параметров для следующей (вызываемой) функции.
Не шибко понятно. Колбэк, это путь сделать исполнителя независимым от того что он сделает. В части гуи это очень неплохо просматиривается. Кнопке должно быть всё едино, на то что вы хотите сделать нажав на неё. Её логика проста: -"У мене внутре… гм… не… неонка"
1
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
24.07.2022, 17:30
Я полагаю что само по себе программирование с помощью колбэк функций это порочная практика. Они должный уйти в прошлое. И программирование должно перейти от объектно ориентированного к субьектноориентированному.
По сути все это и делается но только через задний вход "где-то на аляске" сейчас это называется "микросервисы"
то есть куски кода которые выполняются независимо и общаются между собой по какому-то интерфейсу (почему-то навязывается протокол веб сервиса)
Есть очень серьёзные подозрения что весь windows в глуби своей изначально именно так и сделан а winapi, с его колбеками это суровое изобретение чтобы ввести по ложному пути доверчивую публику.
Совершенно не понимаю почему в жаваскрипе и winape функции обработки событий также названы колбеками? Это конечно весело использовать названия приятные старожилам отрасли но это не соответствует действительности.

Это напоминает мне историю с переменными в бейсике в 90-х годах. Все серьезные программеры дико ржали над теми кто не понимает зачем надо каждый раз определять тип переменной, и почему она не может быть динамической сразу. Мол порядок должен быть это вам не детский сад. А потом оказалось что они есть, и динамические переменные и динамические массивы и все тоже самое только в бейсике каждый человек мог их использовать сразу с первой строчки кода, а вот в С++ это все либо в ручную с помощью распределения памяти, либо функциями STL.
Где начинающий программер а где STL ?
Могли бы например делать язык программирования так: Есть динамические переменные с автоматически определяемым типом и они доступны СРАЗУ самым простым видом объявления, но КОГДА ВАМ НУЖНО можно использовать точно определяемые переменные с точной величиной и для этого есть дополнительный синтаксис.
0
24.07.2022, 18:06

Не по теме:

Цитата Сообщение от Святогор Посмотреть сообщение
Могли бы например делать язык программирования так
Святогор, вы могли бы купить яхту и радоваться, вместо того, чтобы после покупки машины возмущаться "а где же у неё парус и почему она на воде не держится"

0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
24.07.2022, 18:15
Святогор, ни одна архитектура процессора не умеет "из коробки" работать с произвольными типами переменных. А значит если по-умолчанию использовать "произвольный тип", то код в среднем получится неоптимальным, поскольку перед обработкой процессором нужно будет превращать в форму, в которой он сможет эту переменную обработать, а потом возвращать обратно. Если так нужно - добро пожаловать в python - там всё именно так и сделано. А в С++ такое делать можно (как из коробки - используя динамическое преобразование типов, так и самостоятельно) но в большинстве случаев не нужно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.07.2022, 13:56
Цитата Сообщение от Святогор Посмотреть сообщение
программирование с помощью колбэк функций это порочная практика
с чего вдруг?

Цитата Сообщение от Святогор Посмотреть сообщение
сейчас это называется "микросервисы"
у них под капотом те же самые колбэки.
0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
28.07.2022, 12:16
Цитата Сообщение от TRam_ Посмотреть сообщение
вятогор, ни одна архитектура процессора не умеет "из коробки" работать с произвольными типами переменных. А значит если по-умолчанию использовать "произвольный тип", то код в среднем получится неоптимальным
А никто и не говорит что код сразу должен быть "оптимальным". Даже если вы используете точное обьявление переменных это никаким образом не означает что код будет оптимальным. Большинство программ которые пишет широкий круг людей не нуждаются в максимальной оптимальности.

Я говорю о том что почемуто разработчиками языков и сред разработки принято делать отсутствие легкого дефолтного пути.

Лучше всего это понять на примере open gl.

Прежде чем нарисовать один пиксел я должен очень много знать о том как устроен open gl. На это нужно потратить месяц.
Причем код для вывода простейшего обьекта на экран содержит 30 строчек.
Это заградительный подход и по всей видимости сделанный намерено.

Вот другой подход. Одна команда draw_pixel(x,y); Которая если нет "окна по умолчанию" сама его создаст в базовом разрешении 640 на 480 и нарисует этот пиксел дефолтным черным цветом. Очевидно что это как вы говорите далеко не оптимальный способ. Далее следуют такие соображения, Хотите другой цвет? ОК есть перегрузка функции draw_pixel(x,y,с); Вам не нравится дефолтное разрешение? Ок есть команда set_canvas_resolution (x,y).
Что вам хочется самому создать окно и определить будет ли оно на весь экран? Ок тогда вот вам обьект с методами и свойствами.

Далее вы вдруг поняли что таким макаром не создать хорошей анимации, ну что ж тогда рисуйте в специальный буфер а потом выводите его на экран.
Что оказалось что 3d объекты хлопотно пикселами рисовать? Не вопрос рисуйте полигонами есть команда.

То есть вы пользуетесь той глубиной возможностей которая вам нужна а не сразу всем хламом аж до самого асемблера.

Таким образом если нужно вы спокойно , быстро и комфортно придете ко всем свойствам open gl и даже до аппаратных особенностей видеокарты дойдете.
В этом случае все становится очевидным и легко осваивается до того уровня который нужен в вашем проекте. И делаете вы это ещё в 5 классе средней школы сразу без чтения книг и и просмотра гнусавых гайдов на ютубе записаных ночью на кухне пока все спят.

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

Добавлено через 17 минут
Лично у меня есть полное ощущение того что крупные производители базового софта намерено усложняют освоение программирования и вообще порог вхождения в эту индустрию. Всё таки деньжищи там совершенно гигантские крутятся и никто не хочет расставаться с халявным потоком простых человеческих радостей.

Ну вот например программирование в стиле микросервисов напрашивалось изначально ещё во времена бейсика на спектруме.
Несколько кусков кода работающих независимо и обменивающихся сообщениями это очевидный подход. Вы сделали танчик и он должен существовать отдельно это же сразу очевидно.
Это можно было бы делать как на уровне среды разработки которая может квантовать время так и на аппаратном уровне чтобы время между выполнением участков кода квантовал процессор. Это всема простая задача. Более того никаого лишнего расхода производительности цп она не требует
Но это не было сделано и не сделано и по сегодняшний день. Вместо этого был дан "обьектно ориентированный подход" который имеет одно фундаментальное ограниечение которое в итоге приводит в упадок любой проект.
Дело в том что ООП представляет собой описание некой работающей сущности а не является ей по сути и по этой причине чем точнее вы пытаетесь описать обьект реального мира тем быстрее растет сложность по экспоненте и конца и края не видно.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
28.07.2022, 12:28
Святогор, вы совершаете одну ошибку - не учитываете реальность и историю развития.

Цитата Сообщение от Святогор Посмотреть сообщение
Прежде чем нарисовать один пиксел я должен очень много знать о том как устроен open gl. На это нужно потратить месяц.
Причем код для вывода простейшего обьекта на экран содержит 30 строчек.
Это заградительный подход и по всей видимости сделанный намерено.
Посмотрите на более оптимальный Vulkan - там это займет куда больше строчек и времени.

Цитата Сообщение от Святогор Посмотреть сообщение
ОК есть перегрузка функции draw_pixel(x,y,с);
Это API C'шный, в нем нет перегрузки функций -> функция будет уже не draw_pixel, а draw_pixel_color или как-то так.
А вообще, всё это можно одной картинкой описать.


Цитата Сообщение от Святогор Посмотреть сообщение
Которая если нет "окна по умолчанию" сама его создаст в базовом разрешении 640 на 480 и нарисует этот пиксел дефолтным черным цветом.
OpenGL - это именно графический стандарт, он не привязан к окнам.
В разных ОС или в рамках одной ОС окна создаются совершенно по разному, имеют разную толщину рамки, разные устройства имеют разный размер пикселей и т.д.
Вот вам простые вопросы для решения.
640x480 - это вместе с рамкой или без нее?
А если устройство вывода не поддерживает такое разрешение?
А если 640x480 - это без рамки то что делать на устройстве, которое максимум 640x480 поддерживает?
А если с рамкой, то какая останется область для рисования? Правильно - везде разная.
А представьте, что у вас вообще нет окон.

Цитата Сообщение от Святогор Посмотреть сообщение
То есть вы пользуетесь той глубиной возможностей которая вам нужна а не сразу всем хламом аж до самого асемблера.
Низкоуровневые API предназначены для тех, кто хочет вытянуть максимум из возможностей, т.е. считай, для тех кто уже умеет или хочет научиться.
А вот более простые и понятные способы сделать тоже самое - это как раз задача более высокоуровневых библиотек, которые оборачивают низкоуровневый API, предоставляя вам более простые интерфейсы, но урезая ваши возможности.

Цитата Сообщение от Святогор Посмотреть сообщение
Таким образом если нужно вы спокойно , быстро и комфортно придете ко всем свойствам open gl и даже до аппаратных особенностей видеокарты дойдете.
Ага. Берем библиотечку уровня повыше и когда нужно, потихоньку спускаемся на уровень пониже. Всё просто.

Цитата Сообщение от Святогор Посмотреть сообщение
Лучше всего это понять на примере open gl
Лучше всего это понять на примере JavaScript.
0
фрилансер
 Аватар для Алексей1153
6509 / 5764 / 1135
Регистрация: 11.10.2019
Сообщений: 15,407
28.07.2022, 12:28
Цитата Сообщение от Святогор Посмотреть сообщение
Прежде чем нарисовать один пиксел я должен очень много знать о том как устроен open gl. На это нужно потратить месяц.
целый месяц на поиск примера в тырнете - это сильно

Цитата Сообщение от Святогор Посмотреть сообщение
производители базового софта намерено усложняют освоение программирования
Это как? Не разрешают книгу по языку заказать в магазине?

Цитата Сообщение от Святогор Посмотреть сообщение
чем точнее вы пытаетесь описать обьект реального мира тем быстрее растет сложность по экспоненте и конца и края не видно.
всё диаметрально противоположно: ООП позволяет не думать о деталях
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
28.07.2022, 12:38
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Не разрешают книгу по языку заказать в магазине?
Как в том "интервью" Страуструпа
0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
28.07.2022, 12:43
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Это как? Не разрешают книгу по языку заказать в магазине?
1)Прочитав любое количество книг не позволит вам сделать хоть что то стоящее. Это так не работает.
2)Не так уж много книг может освоить человек.
3)Тратить время и ресурсы интеллекта надо разумно тем более если есть более простой подход который позволяет
начинать писать код сразу без чтения томов. (тот который я описал если вы поняли)
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
28.07.2022, 12:56
Цитата Сообщение от Святогор Посмотреть сообщение
1)Прочитав любое количество книг не позволит вам сделать хоть что то стоящее. Это так не работает.
2)Не так уж много книг может освоить человек.
3)Тратить время и ресурсы интеллекта надо разумно тем более если есть более простой подход который позволяет
начинать писать код сразу без чтения томов. (тот который я описал если вы поняли)
Ваш draw_pixel и компания никак не решает ни один из вопросов.
0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
28.07.2022, 13:07
Цитата Сообщение от Croessmah Посмотреть сообщение
OpenGL - это именно графический стандарт, он не привязан к окнам.
В разных ОС или в рамках одной ОС окна создаются совершенно по разному, имеют разную толщину рамки, разные устройства имеют разный размер пикселей и т.д.
Вот вам простые вопросы для решения.
640x480 - это вместе с рамкой или без нее?
Вы или не поняли идею которую я предложил или эмоции побуждают вас не соглашаться с очевидным.
Тем не менее поясняю. Программисту в начале должно быть все равно оконная это среда или нет. Есть там рамки или нет.
Если система где запущен код имеет графические возможности то по команде draw_pixel(x,y) пиксел должен быть нарисован.
Далее при надобности используйте более глубокие возможности так как я уже пояснил в предыдущем посте. Дефолтный вход должен быть и все тут. Именно таким образом можно делать так что все пятикласники начнут писать работающий софт и никак иначе.
Извините но вот например консоль как-то сумели сделать универсально работающую во всех ос и в каждом утюге, хотя это тоже сложная вещь у нее и графический вид и клавиатура и мышка работает.
Не знаю почему но в том же С++ по чему то за 50 лет никто не продвинулся а стандартизации ввода вывода дальше консоли. Ни изображения ни звука ни управления там нет ни в каких стандартных потоках.

Хорошо я понимаю вы давите на то что нельзя сделать дефолтный вывод пиксела чтоб он работал и на виндовс и на линукс и на ардуине и на сегментном индикаторе микроволновки с PIC контроллером.
Во первых я не это имел ввиду, дефолтный вход для графики (равно как и для всего другого) даже если он реализован в рамках одной платформы windows это всеравно очень большое дело
Во вторых при большом желании можно сделать так что и полная кросплатформенность будет работать .
Для этого нужно ввести возможность исследования системы самим кодом. Вы должны имет возможность вывести этот пиксел незная как это будет работать, например вы ввели команду draw_pixel(x,y) а оказалось что это сегментный индикатор часов а вовсе не full hd у вас загорелся какой-то сегмент. Вы видите что система работает, после чего вы спрашиваете у системы а что собственно за графическое устройство у вас сэр? Вам приходит ответ устройство имеет разрещение 3 на 5 пикселов и вообще оно не матричного типа. Руководствуясь этими соображениями у вас через 15 минут работы есть код работающий на совершенно неизвестной вам системе
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
28.07.2022, 13:14
Цитата Сообщение от Святогор Посмотреть сообщение
Не знаю почему но в том же С++ по чему то за 50 лет никто не продвинулся а стандартизации ввода вывода дальше консоли.
Может быть я вас огорчу, но в C++ вообще нет ввода-вывода на консоль.
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
28.07.2022, 13:24

Не по теме:

Цитата Сообщение от Святогор Посмотреть сообщение
Вы или не поняли идею которую я предложил или эмоции побуждают вас не соглашаться с очевидным.
Тем не менее поясняю. Программисту в начале должно быть все равно оконная это среда или нет. Есть там рамки или нет.
Если система где запущен код имеет графические возможности то по команде draw_pixel(x,y) пиксел должен быть нарисован.
Далее при надобности используйте более глубокие возможности так как я уже пояснил в предыдущем посте.
???
Цитата Сообщение от Croessmah Посмотреть сообщение
Ага. Берем библиотечку уровня повыше и когда нужно, потихоньку спускаемся на уровень пониже. Всё просто.



Добавлено через 6 минут

Не по теме:

Цитата Сообщение от Святогор Посмотреть сообщение
Именно таким образом можно делать так что все пятикласники начнут писать работающий софт и никак иначе.
Именно поэтому пятикласникам не преподают С/С++ и пр. ассемблеры.
В каком-нибудь VB есть ваш заветный draw pixel из коробки.

0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
28.07.2022, 13:28
Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от Святогор
1)Прочитав любое количество книг не позволит вам сделать хоть что то стоящее. Это так не работает.
2)Не так уж много книг может освоить человек.
3)Тратить время и ресурсы интеллекта надо разумно тем более если есть более простой подход который позволяет
начинать писать код сразу без чтения томов. (тот который я описал если вы поняли)
Ваш draw_pixel и компания никак не решает ни один из вопросов.
Решает. Ещё и как. draw_pixel - это пример подхода к освоению графических возможностей компьютера , который упрощает освоение в сотни раз. Вы увеличиваете свои знания по мере необходимости а не сразу читаете том после которого сможете нарисовать пиксел.
Разумеется это пример который показывает общий подход и не только для графики. Это касается и звука и всех коммуникаций и средств управления.
Это реализовано в некоторых местах почти в чистом виде в ардуино.
Например это касается коммуникации по серийному порту.
Там есть команда Serial.print(); С помощью неё вы сразу выводите информацию в серийный порт.
Причем ей все равно что вы ей скормили текст или число.
Всё работает сразу с дефолтными настройками. Если надо настройки соединения можно изменить дополнительной командой. Если надо выводить информацию точно побайтно есть другая команда. И так далее вы можете углубляться
до прерываний и кода на ассемблере.

А теперь серийный порт на c#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
// Use this code inside a project created with the Visual C# > Windows Desktop > Console Application template.
// Replace the code in Program.cs with this code.
 
using System;
using System.IO.Ports;
using System.Threading;
 
public class PortChat
{
    static bool _continue;
    static SerialPort _serialPort;
 
    public static void Main()
    {
        string name;
        string message;
        StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        Thread readThread = new Thread(Read);
 
        // Create a new SerialPort object with default settings.
        _serialPort = new SerialPort();
 
        // Allow the user to set the appropriate properties.
        _serialPort.PortName = SetPortName(_serialPort.PortName);
        _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
        _serialPort.Parity = SetPortParity(_serialPort.Parity);
        _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
        _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
        _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);
 
        // Set the read/write timeouts
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;
 
        _serialPort.Open();
        _continue = true;
        readThread.Start();
 
        Console.Write("Name: ");
        name = Console.ReadLine();
 
        Console.WriteLine("Type QUIT to exit");
 
        while (_continue)
        {
            message = Console.ReadLine();
 
            if (stringComparer.Equals("quit", message))
            {
                _continue = false;
            }
            else
            {
                _serialPort.WriteLine(
                    String.Format("<{0}>: {1}", name, message));
            }
        }
 
        readThread.Join();
        _serialPort.Close();
    }
 
    public static void Read()
    {
        while (_continue)
        {
            try
            {
                string message = _serialPort.ReadLine();
                Console.WriteLine(message);
            }
            catch (TimeoutException) { }
        }
    }
 
    // Display Port values and prompt user to enter a port.
    public static string SetPortName(string defaultPortName)
    {
        string portName;
 
        Console.WriteLine("Available Ports:");
        foreach (string s in SerialPort.GetPortNames())
        {
            Console.WriteLine("   {0}", s);
        }
 
        Console.Write("Enter COM port value (Default: {0}): ", defaultPortName);
        portName = Console.ReadLine();
 
        if (portName == "" || !(portName.ToLower()).StartsWith("com"))
        {
            portName = defaultPortName;
        }
        return portName;
    }
    // Display BaudRate values and prompt user to enter a value.
    public static int SetPortBaudRate(int defaultPortBaudRate)
    {
        string baudRate;
 
        Console.Write("Baud Rate(default:{0}): ", defaultPortBaudRate);
        baudRate = Console.ReadLine();
 
        if (baudRate == "")
        {
            baudRate = defaultPortBaudRate.ToString();
        }
 
        return int.Parse(baudRate);
    }
 
    // Display PortParity values and prompt user to enter a value.
    public static Parity SetPortParity(Parity defaultPortParity)
    {
        string parity;
 
        Console.WriteLine("Available Parity options:");
        foreach (string s in Enum.GetNames(typeof(Parity)))
        {
            Console.WriteLine("   {0}", s);
        }
 
        Console.Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString(), true);
        parity = Console.ReadLine();
 
        if (parity == "")
        {
            parity = defaultPortParity.ToString();
        }
 
        return (Parity)Enum.Parse(typeof(Parity), parity, true);
    }
    // Display DataBits values and prompt user to enter a value.
    public static int SetPortDataBits(int defaultPortDataBits)
    {
        string dataBits;
 
        Console.Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits);
        dataBits = Console.ReadLine();
 
        if (dataBits == "")
        {
            dataBits = defaultPortDataBits.ToString();
        }
 
        return int.Parse(dataBits.ToUpperInvariant());
    }
 
    // Display StopBits values and prompt user to enter a value.
    public static StopBits SetPortStopBits(StopBits defaultPortStopBits)
    {
        string stopBits;
 
        Console.WriteLine("Available StopBits options:");
        foreach (string s in Enum.GetNames(typeof(StopBits)))
        {
            Console.WriteLine("   {0}", s);
        }
 
        Console.Write("Enter StopBits value (None is not supported and \n" +
         "raises an ArgumentOutOfRangeException. \n (Default: {0}):", defaultPortStopBits.ToString());
        stopBits = Console.ReadLine();
 
        if (stopBits == "" )
        {
            stopBits = defaultPortStopBits.ToString();
        }
 
        return (StopBits)Enum.Parse(typeof(StopBits), stopBits, true);
    }
    public static Handshake SetPortHandshake(Handshake defaultPortHandshake)
    {
        string handshake;
 
        Console.WriteLine("Available Handshake options:");
        foreach (string s in Enum.GetNames(typeof(Handshake)))
        {
            Console.WriteLine("   {0}", s);
        }
 
        Console.Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString());
        handshake = Console.ReadLine();
 
        if (handshake == "")
        {
            handshake = defaultPortHandshake.ToString();
        }
 
        return (Handshake)Enum.Parse(typeof(Handshake), handshake, true);
    }
}


Прошу заметить что этот код скорее всего не будет работать несмотря на то что он взят с официальной документации. Это обычное дело. Там версии не сходятся или вы его "нетуда" вставили.
Мало того данный код совершенно не годится для нормальной работы , дело в том что его ещё надо отправить в отдельный поток чтобы он не мешал работать интерфейсу вашей программ .
Ау пятикласиник? он уже спит....
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
28.07.2022, 13:36
Цитата Сообщение от Святогор Посмотреть сообщение
это пример подхода к освоению графических возможностей компьютера , который упрощает освоение в сотни раз.
Графические возможности компьютера куда шире и как раз-таки, чтобы их осваивать "hello world" подхода недостаточно.

Цитата Сообщение от Святогор Посмотреть сообщение
Вы увеличиваете свои знания по мере необходимости а не сразу читаете том после которого сможете нарисовать пиксел.
Выше написал про библиотеки.

Цитата Сообщение от Святогор Посмотреть сообщение
Там есть команда Serial.print(); С помощью неё вы сразу выводите информацию в серийный порт.
Заметьте - "библиотеку" Serial уже кто-то написал за вас, а она уже использует более низкоуровневые интерфейсы.
"API" железяки куда сложнее, почему вы не предложите прямо в "процессор" добавить команду Serail.print?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.07.2022, 13:36

приведите пожалуйста реальный прмиер: для чего нужны дружественные функции?
приведите пожалуйста реальный прмиер: для чего нужны дружественные функции?

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

callback функции не для кнопок на экране, а для клавиш на клав. и мышке. Как?
Я так понимаю, что в WIN API все действия делаются асинхронно через callback функции. Но как инициировать действие для клавиш клавиатуры...

Для чего нужны интерфейсы?
Объясните на пальцах для чего нужны интерфейсы, как я понял они описывают методы и свойства, которые при наследовании классами должны были...

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно new delete


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru