powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Различать каллбаки
15 сообщений из 15, страница 1 из 1
Различать каллбаки
    #37997139
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предположим есть некая функция асинхронная которая дает возможность передать ей каллбак чтобы известить о завершении выполнения. Эта функция пусть выполняется длительное время. За которое может случиться еще один вызов этой функции. Нам нужно различать для какого вызова какой каллбэк прилетел, при условии что очередность каллбэков не равна очередности вызовово этой функции. Как?

Пример:
вызываем
init (порядковый номер 1)
init (2)
init (3)
callback (для какого init? 1,2 или 3)
callback - ?
callback - ?
...
Рейтинг: 0 / 0
Различать каллбаки
    #37997145
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSqlНам нужно различать для какого вызова какой каллбэк прилетел

Приличные функции для этого принимают ещё один параметр, который и передают колбэку при
вызове.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различать каллбаки
    #37997183
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovFatherSqlНам нужно различать для какого вызова какой каллбэк прилетел

Приличные функции для этого принимают ещё один параметр, который и передают колбэку при
вызове.

ну так то приличные
...
Рейтинг: 0 / 0
Различать каллбаки
    #37998995
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql, у тебя есть еще вопросы по теме?
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999071
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пожалуй
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999077
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай спрашивай. Мы в форуме С++. Поэтому желательно подкреплять вопросы
рабочими исходниками.
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999271
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос в первом посте
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999275
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSqlну так то приличные
А авторам неприличных чистят морду лица пока не поумнеют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999352
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSqlвопрос в первом постеКопирую свой вопрос из дубликата темы: "Что мы пишем - init или callback? Точнее, в каких пределах можно модифицировать первое и второе?"
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999511
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbstractionFatherSqlвопрос в первом постеКопирую свой вопрос из дубликата темы: "Что мы пишем - init или callback? Точнее, в каких пределах можно модифицировать первое и второе?"
инит это библиотечная функция, каллбэк наш но с заданной сигнатурой
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999520
vvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,

и код - секретный?
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSqlвопрос в первом посте
Функция с состоянием - это метод объекта. Тебе нужно заюзать ООП в явном
(C++ class) или неявном виде. Если вычленить состояние невозможно
то объявляй то на уровне кода требуй последовательного (синхронного)
исполнения init и callback через третью функцию.
...
Рейтинг: 0 / 0
Различать каллбаки
    #37999547
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,

Принцип такой.
Если надо запускать одновременно несколько асинхронных заданий, то значит должна быть организована очередь (список) этих заданий, в которую ваша init() кладет задания и из которой менеджер заданий их извлекает и выполняет по очереди (через цикл событий) или параллельно (через пул потоков).
Каждый объект в очереди - это класс/структура содержащая в полях параметры задания и колбэк который нужно вызвать после выполнения задания, передав ему часть или все параметры а также результат, если он предусмотрен. По этим входным параметрам внутри колбэка а так же по самому колбэку (если например в качестве колбэка считать this экземпляра класса + адрес метода ) и будете определять к чему именно относится данный вызов.

Как пример неплохо спроектированного интерфейса к такой библиотеке могу привести boost.asio:

Код: plaintext
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.
void calc_task(int a, boost::function<void(int,int)> handler)
{
  int res = ...;// какое-то вычисление из a
  handler(a, res);
}

void calc_handler(int a, int res)
{
  cout << a << " -> " << res << endl;
}
  
boost::asio::io_service srv;

int main()
{
  // добавляем задания в очередь
  srv.post(boost::bind(calc_task, 1, calc_handler));
  srv.post(boost::bind(calc_task, 2, calc_handler));
  srv.post(boost::bind(calc_task, 3, calc_handler));
  srv.run(); // запускаем событийный цикл, который выполнит все задания и завершится
}

// ну или в вашем случае

void init(int a)
{
  srv.post(boost::bind(calc_task, a, calc_handler));
}

int main()
{
  // добавляем задания в очередь
  init(1);
  init(2);
  init(3);
  srv.run(); // запускаем событийный цикл (будет вызван calc_handler для каждого вызова init)
}
...
Рейтинг: 0 / 0
Различать каллбаки
    #38000182
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, чтото про this забыл, но надо проверить можно ли передать метод класса функции
...
Рейтинг: 0 / 0
Различать каллбаки
    #38000237
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSqlAbstractionпропущено...
Копирую свой вопрос из дубликата темы: "Что мы пишем - init или callback? Точнее, в каких пределах можно модифицировать первое и второе?"
инит это библиотечная функция, каллбэк наш но с заданной сигнатуройСредствами языка в нынешнем варианте - никак. Произошло три вызова init, затем три раза вызвали callback с одними и теми же аргументами. При любом порядке вызовов Ваш код увидит одну и ту же картину.
Если выйти за пределы возможностей языка, в порядке бреда можно попытаться опереться на адрес вершины стека и сканировать стек, но у меня нет уверенности, что это способно сработать даже теоретически. Единственный выход, который я вижу - различные callback в каждом случае, тогда можно будет разобраться, опираясь на текущий адрес инструкции... но если количество вызовов init неизвестно на момент написания программы, это означает исполнение кода в динамически выделенной памяти, что могут зарезать разнообразные средства защиты от вирусов.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Различать каллбаки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]