Вопрос

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

Спасибо.

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

Аналогия?

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top