Функции обратного вызова - PullRequest
0 голосов
/ 26 ноября 2009

Кто-то предложил мне использовать функции обратного вызова для реализации таймера, работающего в фоновом режиме, пока мое серверное приложение считывает ввод с клиентов.Я попытался посмотреть объяснения в Интернете, но надеялся, что кто-нибудь может дать мне более простую аналогию.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 26 ноября 2009

Существует два отдельных способа реализации таймера с помощью обратных вызовов в Windows, SetTimer и timeSetEvent. Основы:

  1. SetTimer использует сообщения, даже если вы используете обратный вызов (функция обратного вызова вызывается в результате обработки сообщения). Так что SetTimer не работает, если вы не запускаете насос сообщений.

  2. Обратные вызовы вызываются операционной системой, которая не знает C ++ указатель «this» из дыры в земле, поэтому ваш обратный вызов должен быть либо глобальной функцией в стиле C, либо статическим членом.

  3. timeSetEvent является частью семейства «мультимедийных» таймеров и не требует обработки сообщений. Замечания о сигнатуре функции обратного вызова выше все еще применимы все же. Отсутствие требования к насосу сообщений может быть важным, если вы пишете консольное приложение.

  4. Вы также можете рассмотреть многопоточность и CreateWaitableTimer, но я не очень часто использую ожидаемые таймеры, поэтому не могу их комментировать.

Если вам нужно работать в фоновом режиме, то многопоточность может быть гораздо более элегантным способом решения проблемы. Вам не нужно делить работу на куски, когда вы работаете с потоками (что вы делаете, если вы запускаете работу по таймеру). Но, конечно, ваш поток не может касаться GUI, поэтому жизнь может усложнить немного , когда вы начнете создавать потоки. На моем сайте есть введение в рабочие темы здесь .

1 голос
/ 26 ноября 2009

Аналогия

Посмотрите здесь краткое объяснение функций обратного вызова:
Что такое «обратный вызов» в C и как они реализованы?

Использование таймера с обратным вызовом будет означать «вызов функции x каждые y секунд», а с системой, поддерживающей многозадачность, эта функция будет вызываться каждые y секунд во втором потоке выполнения, независимо от того, что может исходная функция делать.

Редактировать: Как было предложено в другом ответе, система может не создать второй поток для вас, в этом случае вам придется создать поток самостоятельно и настроить обратный вызов из этого потока.

Редактировать: в Windows вы можете использовать функцию SetTimer . Он отправит сообщение WM_TIMER в очередь сообщений вашего окна, которую ваш цикл сообщений может обработать сам или передать в процедуру сообщения по умолчанию для вызова функции обратного вызова, которую вы указали. Я не уверен, что произойдет, если у вас нет окна, но попробуйте.

0 голосов
/ 26 ноября 2009

Ваш вопрос довольно неясен, но, вероятно, они предлагали вам создать поток и запустить свою функцию в этом потоке.

Это может быть сделано путем создания подкласса системного Thread класса; создавая тот же класс с некоторой функцией обратного вызова в качестве аргумента; создав таймер, который вызывает функцию обратного вызова через некоторое время ... без более конкретного вопроса я не могу дать более конкретный совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...