|
|
  |
Структура функций, В чём преимущество ? |
|
|
|
May 3 2014, 23:10
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(ViKo @ May 3 2014, 17:01)  Обратно - это куда? "Сигнал посылаем - вы что это там? А нас посылают обратно!" Можете привести пример менее аб... абстрактный? Привожу. Посылаю CAN message. Записать я его по SPI записал. Теперь когда результат доставки будет - неизвестно, а мне надо еще посылать. Передаю "позывные" своего message и говорю: свиснешь как доставишь - получилось, нет.. И передаю следующий в буффер.. Вот когда будет результат доставки, CAN вызовет callback (позовет меня обратно) и скажет смог или нет
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 13:01
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(AHTOXA @ May 4 2014, 01:29)  По-моему, callback - это просто. Например, есть функция вывода jpg-картинки на экран. Она умеет декодировать картинку. Но не знает, как отрисовать пиксель на экране. Мы вызываем её, и в качестве параметра передаём указатель на функцию отрисовки пикселя. Такой подход позволяет уменьшить связность программ. Можно не передавать функцию в качестве параметра при вызове каждый раз, а передать её один раз при инициализации библиотеки. Функция может выполняться в отдельном потоке. Тогда она будет вызывать наш callback асинхронно. Но это уже частности, суть от этого не меняется. нет, это не callback. Это аналог виртуальной функции в C++, которая может быть подменена на ходу. Callback всегда асинхронен. И всегда по какому то событию. Цитата(ViKo @ May 4 2014, 01:13)  Handshake? По-моему, вы спекулянт (понятиями). Это абсолютно другое понятие.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 15:10
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(AHTOXA @ May 4 2014, 08:09)  Вы что-то путаете. callback - это функция обратного вызова. И всё. Нет гарантии что каллбэк синхронен. Именно поэтому он так и называется. "Право на звонок" передается другому треду. Если функция вызывается из того же треда то это не каллбэк. Как там экономно такси вызывают? Звонишь на номер и отключаешся. Ждешь каллбэк. Полная аналогия.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 18:36
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(AHTOXA @ May 4 2014, 11:56)  Ага. Было "Callback всегда асинхронен", теперь "Нет гарантии что каллбэк синхронен"  А это одно и тоже. он асинхроннен, но в теории может совпасть. Цитата(ViKo @ May 4 2014, 13:19)  Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции. Нет. Не то. Не понимаю, что не понятно? Это не "туда обратно". Это аналогично прерыванию. Время события как правило неизвестно. Поэтому ни какие "туда-обратно". Это не "функция возвращающаяся назад". И не "вызывающая другие функции". У ембеддеров есть понятие прерывания, у десктопных или как вы их называете, обычных программеров прерывания нет. Если ему надо переслать чтото в последовательный порт, он запишет данные в буффер, вызовет функцию работы с портом, передаст туда аддресс callback функции и уйдет по делам делать другую работу. Когда посылка завершится, система вызовет callback и передаст туда результаты. Никакая это не "тудаобратно". И не "возвращающаяся назад"
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
May 4 2014, 18:43
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ViKo @ May 5 2014, 00:19)  Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции. Нормальный перевод. Мы вызываем библиотечную функцию, она в процессе своей работы вызывает нас обратно, через переданную ей в качестве параметра функцию обратного вызова. Цитата(A. Fig Lee @ May 5 2014, 00:36)  А это одно и тоже. он асинхроннен, но в теории может совпасть. Ну хватит уже нести чушь. Вы неправильно понимаете, что такое callback. Вот пример синхронного калбэка: EnumWindowsЦитата BOOL WINAPI EnumWindows( _In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam );
Parameters: lpEnumFunc [in] Type: WNDENUMPROC A pointer to an application-defined callback function. For more information, see EnumWindowsProc.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 4 2014, 18:55
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(AHTOXA @ May 4 2014, 21:43)  Нормальный перевод. Мы вызываем библиотечную функцию, она в процессе своей работы вызывает нас обратно, через переданную ей в качестве параметра функцию обратного вызова. По-вашему, получается, callback - это функция, в которую передали другую функцию в качестве параметра. Так прямо "вызывает"? Может, все таки, возвращается? Разве вызываемая функция не вернется в вызывающую (библиотечную, в вашем примере)? По-моему, callback - это как раз та функция, которую передали. Функция, возвращающаяся назад...? Так они все назад...
|
|
|
|
|
May 4 2014, 18:58
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(ViKo @ May 4 2014, 21:19)  Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции. Не хочу использовать понятие функции, поскольку возможны подмены из математики. Переход по адресу подпрограммы с возвратом - вызов подпрограммы, что и есть "вызов функции". Себе Вы можете представить что угодно, но поскольку Вы не нативный носитель языка и не лингвист, то лучше обратиться к причинам, по которым "callback" появился. Причины просты: при декомпозиции программы появляются отдельные независимые модули, которые могут получать данные, которые должны обрабатываться различно в зависимости от контекста выполнения. Поэтому им не надо их обрабатывать, а надо сообщить о них "знающему" модулю. Это легко сделать, когда программа монолитна, а если модули независимы, то необходимо передавать в связанные модули адреса подпрограмм для "обратной связи" по обработке данных. Вот подпрограмма, адрес которой передается в таком случае - имеет жаргонизм "callback". P.S. И прошу помнить о раздельной компиляции модулей.
|
|
|
|
|
May 4 2014, 19:10
|
Знающий
   
Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768

|
Цитата(ViKo @ May 4 2014, 22:06)  То есть, события, асинхронность - не при чем? Просто передаем один из возможных методов (функций)? Конечно (Только "методы" - это такое ограничение на "функции", которое наложил C++). Вот у Вас есть программно-аппаратный модуль, который программирует таймер, обрабатывает от него прерывания. Он все знает о таймере. Вы его запрограммируете и все. А как узнать, что время, которое Вы заказали, прошло? Надо передать адрес подпрограммы, которая будет вызвана по истечении времени. Это как раз простейший пример "callback" подпрограммы. P.S. В данном контексте подпрограмма для "обратной связи" модулей.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|