![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Добрый день!
Прочитал достаточно много за свою жизнь книжек по программированию на C/C++, но нигде не встретил описания функций CallBack. Кто-нибудь может объяснить с примером? как и что и где и зачем работает??? Заранее благодарен. -------------------- я не гольфист - я хоккеист |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
это функция которую кто-то где-то вызывает по наступлению определенного события.
почитай описание EnumWindows() и ее EnumWindowsProc() -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
_hunter Спасибо, кто-то и где-то - это самый исчерпывающий ответ, который я вообще мог когда-либо ожидать!!! такая помощь просто неоценима...
Добавлено @ 11:12 почитал EnumWindows() и ее EnumWindowsProc() - про callback функции таки сказано, кто-то и где-то. А я все-таки просил доходчиво объяснить. Если нет людей, способных объяснить это на понятном языке - тогда другое дело, можно обойтись "кто-то и где-то". Но может быть кто-то есть? Ну не встречал я в книгах описание callback функций, может ссылку на книжку кто даст? -------------------- я не гольфист - я хоккеист |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
а что тебе в этом ответе не нравится / не понятно? или тебя что-то конкретное интересует?
Добавлено @ 11:48 P.S. что ты под
понимаеш? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Модератор: Некоторые фрагманты темы были вырезаны цензурой.
|
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 3 Всего: 191 |
СallBack-(косвенно вызваемая) функция - функция, которая вызывается как диспетчер события какой-нибудь сторонней программой (распространено в Windows). Соответственно, чтобы вызвать процедуру косвенно, особенно если она находится не в твоей программе (это я про вызывателя говорю), то нужен её адрес.
Вызов происходит по адресу. Типичный пример - оконная процедура любого окна. Когда окну поступает сообщение, то Windows вызвает (call) эту оконную процедуру (оконная процедура назначается окну через адрес при заполнении структуры оконного класса окна). Это сообщение отредактировал(а) Rrader - 3.10.2005, 13:03 |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 - спасибо, так как ты хоть что-то попытался объяснить, это видимо не принято... -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 3 Всего: 191 |
Для своих целей пишешь любую. Когда ты будешь её вызвать, просто подставь параметры. Колбек вызовется с этими параметрами, и делай в ней че хочешь. Приведу пример: ты сделал библиотеку, в которой одна функция для копирования файла с контролем процента выполненной работы. Первый параметр этой ф-ии - имя файла, второй параметр - колбек-функция. В нее будет передаваться процент выполненной работы каждый раз, когда будет скопирована часть файла. В своей программе ты объявляешь этот колбек как функцию (наподобие TimerProc) и используешь. Например в ней пишешь код обновления ProgressBar. Колбек может быть как процедурой, так и функцией. Если она функция, то вызватель колбека обычно дожидается результата её выполнения. Это сообщение отредактировал(а) Rrader - 3.10.2005, 13:51 |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
не понял, вот так если напишу, то сработает? -------------------- я не гольфист - я хоккеист |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 3 Всего: 191 |
Тут была ошибка
Ты сам должен вызвать колбек явно.
Это сообщение отредактировал(а) Rrader - 3.10.2005, 14:01 |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
а из MyFunc1 она автоматом вызовется или как? не понятно чего-то.
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
_hunter
В моем примере как будет? Добавлено @ 14:15 Rrader еще раз спасибо, так правильно будет?
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
Rrader, в принципе, все правильно написал...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| mo3art |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 29.9.2005 Где: пло не та 3 емля Репутация: нет Всего: нет |
если на пальцах, то коллбэк функция, это такая функция, которую вызовет тот, кого вызываешь ты.
Если говорить о твоём примере, то код будет выглядеть примерно так:
строго говоря модификатор CALLBACK определён в как:
сделано это для того, чтобы параметры в данную функцию передавались стандартным "Си-шным" образом независимо от параметров компиляции проекта. Если же ты пишешь коллбэки для собственных нужд, так как это сделано в примере, то ключевое слово CALLBACK можно опустить при условии, что ты все файлы проекта компилируешь с одинаковыми установками. |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |