Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функции CallBack, объясните кто-нибудь 
:(
    Опции темы
takedo
Дата 3.10.2005, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Добрый день!
Прочитал достаточно много за свою жизнь книжек по программированию на C/C++, но нигде не встретил описания функций CallBack. Кто-нибудь может объяснить с примером? как и что и где и зачем работает???
Заранее благодарен. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
_hunter
Дата 3.10.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



это функция которую кто-то где-то вызывает по наступлению определенного события.
почитай описание EnumWindows() и ее EnumWindowsProc()


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
takedo
Дата 3.10.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



_hunter Спасибо, кто-то и где-то - это самый исчерпывающий ответ, который я вообще мог когда-либо ожидать!!! такая помощь просто неоценима...
Добавлено @ 11:12
почитал EnumWindows() и ее EnumWindowsProc() - про callback функции таки сказано, кто-то и где-то. А я все-таки просил доходчиво объяснить. Если нет людей, способных объяснить это на понятном языке - тогда другое дело, можно обойтись "кто-то и где-то". Но может быть кто-то есть? Ну не встречал я в книгах описание callback функций, может ссылку на книжку кто даст?


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
_hunter
Дата 3.10.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



а что тебе в этом ответе не нравится / не понятно? или тебя что-то конкретное интересует?
Добавлено @ 11:48
P.S.
что ты под
Цитата
описания функций CallBack

понимаеш?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
En_t_end
Дата 3.10.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Модератор: Некоторые фрагманты темы были вырезаны цензурой.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Rrader
  Дата 3.10.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 3
Всего: 191



СallBack-(косвенно вызваемая) функция - функция, которая вызывается как диспетчер события какой-нибудь сторонней программой (распространено в Windows). Соответственно, чтобы вызвать процедуру косвенно, особенно если она находится не в твоей программе (это я про вызывателя говорю), то нужен её адрес. smile

Вызов происходит по адресу. Типичный пример - оконная процедура любого окна. Когда окну поступает сообщение, то Windows вызвает (call) эту оконную процедуру (оконная процедура назначается окну через адрес при заполнении структуры оконного класса окна). smile

Это сообщение отредактировал(а) Rrader - 3.10.2005, 13:03


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
takedo
Дата 3.10.2005, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Вот из мсдн:
[quote]Syntax

VOID CALLBACK TimerProc( HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
);
Parameters

hwnd
[in] Handle to the window associated with the timer.
uMsg
[in] Specifies the WM_TIMER message.
idEvent
[in] Specifies the timer's identifier.
dwTime
[in] Specifies the number of milliseconds that have elapsed since the system was started. This is the value returned by the GetTickCount function.
Return Value

This function does not return a value. [quote]
функция имеет 4 параметра - это всегда так? их типы только такие? А я вот помню что callbak функция может что-либо возвращать, например true или false. И в зависимости от этого можно либо закончить её вызовы либо дальше.
Как написать такую функцию? - это то вот и непонятно. Судя по высказываниям некоторых товарищей на форуме, так проще ничего не может быть! а как сделать - все чего-то молчат. Так как же ее писать?


Rrader - спасибо, так как ты хоть что-то попытался объяснить, это видимо не принято...


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Rrader
  Дата 3.10.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 3
Всего: 191



Цитата

Так как же ее писать?

Для своих целей пишешь любую. Когда ты будешь её вызвать, просто подставь параметры. Колбек вызовется с этими параметрами, и делай в ней че хочешь.

Приведу пример: ты сделал библиотеку, в которой одна функция для копирования файла с контролем процента выполненной работы. Первый параметр этой ф-ии - имя файла, второй параметр - колбек-функция. В нее будет передаваться процент выполненной работы каждый раз, когда будет скопирована часть файла. В своей программе ты объявляешь этот колбек как функцию (наподобие TimerProc) и используешь. Например в ней пишешь код обновления ProgressBar. smile

Колбек может быть как процедурой, так и функцией. Если она функция, то вызватель колбека обычно дожидается результата её выполнения. smile

Это сообщение отредактировал(а) Rrader - 3.10.2005, 13:51


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
takedo
Дата 3.10.2005, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



Код

static int callback CalFuncBack(int n)
{
  for(int i=0;i<n;i++)
 {
   printf("\n%d",n);
 }
 return (n>10)?0:1;
}

void MyFunc1(LPVOID CALLBACK pFunc)
{
  return;
}

int main()
{
  LPVOID cbf = &CalFuncBack;
 MyFunc1(cbf);
}

не понял, вот так если напишу, то сработает?


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Rrader
  Дата 3.10.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 3
Всего: 191



Тут была ошибка

Ты сам должен вызвать колбек явно.
Код

static int callback CalFuncBack(int n)    
{    
  for(int i=0;i<n;i++)    
 {    
   printf("\n%d",n);    
 }    
 return (n>10)?0:1;    
}    
void MyFunc1(LPVOID CALLBACK pFunc)    
{    
  // здесь вызови функцию по адресу
  return;    
}    
int main()    
{    
  LPVOID cbf = &CalFuncBack;    
 MyFunc1(cbf);    
}


Это сообщение отредактировал(а) Rrader - 3.10.2005, 14:01


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
takedo
Дата 3.10.2005, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



а из MyFunc1 она автоматом вызовется или как? не понятно чего-то.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
_hunter
Дата 3.10.2005, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



так и написать:
VOID CALLBACK TimerProc( HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
)
{
//пошел код функции...
}
и сложного тут я ничего не вижу... я не прав?

насчет продолжения/не продолжения в той же справке написано:
To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
что тут непонятного?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
takedo
Дата 3.10.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



_hunter
В моем примере как будет?
Добавлено @ 14:15
Rrader
еще раз спасибо, так правильно будет?
Код

static int callback CalFuncBack(int n)    
{    
  for(int i=0;i<n;i++)    
 {    
   printf("\n%d",n);    
 }    
 return (n>10)?0:1;    
}    
void MyFunc1(LPVOID CALLBACK pFunc)    
{    
  // здесь вызови функцию по адресу
while (pFunc); - а вот здесь как написать? что-бы с параметрами передать.
  return;    
}    
int main()    
{    
  LPVOID cbf = &CalFuncBack;    
 MyFunc1(cbf);    
}



--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
_hunter
Дата 3.10.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



Rrader, в принципе, все правильно написал...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
mo3art
Дата 5.10.2005, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.9.2005
Где: пло не та 3 емля

Репутация: нет
Всего: нет



если на пальцах, то коллбэк функция, это такая функция, которую вызовет тот, кого вызываешь ты. smile Как правило вызов происходит при каких-то определённых условиях.
Если говорить о твоём примере, то код будет выглядеть примерно так:
Код

int CalFuncBack(int n)    
{    
  for(int i=0;i<n;i++)    
 {    
   printf("\n%d",n);    
 }    
 return (n>10)?0:1;    
}  
  
void MyFunc1( int (*pFunc)(int))    
{    
  // здесь вызови функцию по адресу
  if(pFunc); 
      for ( int i  = 0; pFunk ( i ) ; i++ ) // вызываешь свой коллбэк 10 раз
         ;
}  
  
int main()    
{    
  int (*callback)(int)= CalFuncBack;    
 MyFunc1(callback);  
} 


строго говоря модификатор CALLBACK определён в как:
Код

#define CALLBACK __stdcall

сделано это для того, чтобы параметры в данную функцию передавались стандартным "Си-шным" образом независимо от параметров компиляции проекта. Если же ты пишешь коллбэки для собственных нужд, так как это сделано в примере, то ключевое слово CALLBACK можно опустить при условии, что ты все файлы проекта компилируешь с одинаковыми установками.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.