Как реализовать таймер в C на окнах

Если Вы не должны делать этого программно, но просто хотеть управлять своими ключами, то я использовал свободный инструмент KeyMan IBM в течение долгого времени теперь. Очень хороший для экспорта закрытого ключа в файл PFX (тогда можно легко использовать OpenSSL, чтобы управлять им, извлечь его, изменить pwds, и т.д.).

https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview? Выбор communityUuid=6fb00498-f6ea-4f65-bf0c-adc5bd0c5fcc

Ваш keystore, выберите запись с закрытым ключом, затем Файл-> Сохраняет в pkcs12 файл (*.pfx, обычно). Можно тогда просмотреть содержание с:

$ openssl pkcs12 - в mykeyfile.pfx - информация

6
задан Slapout 17 September 2009 в 19:10
поделиться

8 ответов

Взгляните на функцию SetTimer .

UINT_PTR timerid = SetTimer(NULL, 0, milliseconds, &callback);
8
ответ дан 10 December 2019 в 00:41
поделиться

аварийный сигнал делает это (на платформах POSIX).

1
ответ дан 10 December 2019 в 00:41
поделиться

Таймеры не являются частью языка C.

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

0
ответ дан 10 December 2019 в 00:41
поделиться

Если вам не нужно ничего делать в вашем приложении, вы можете использовать функцию sleep () . Он прекратит выполнение, а затем возобновит выполнение кода по истечении указанного времени (иш).

В Windows мы использовали функцию мультимедийного таймера, если вы хотели спать с интервалом менее одной секунды. Некоторые другие методы зависят от платформы.

Я также слышал о людях, использующих 'select ()' как метод сна на милли / микросекунды.

Если вам нужно, чтобы происходили другие вещи, вы ищу возможность использования режима сна / выбора во втором потоке.

Вот библиотека Google для выполнения синхронизации с высоким разрешением . Это может помочь.

0
ответ дан 10 December 2019 в 00:41
поделиться

Один из способов сделать это - вызвать SetTimer, а затем обработать событие WM_TIMER в WndProc. Например, при этом будет установлен таймер, который вызывается каждые 45 секунд и отображает окно сообщения при его вызове:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_CREATE:
            SetTimer(hwnd, 1, 45000, NULL);
            break;

        case WM_TIMER:
            MessageBox(hwnd, L"Timer", L"Timer fired!", MB_OK);
            break;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

Первый параметр SetTimer - это окно, в которое вы хотите получать сообщение WM_TIMER - вы, вероятно, хотите, чтобы это было ваше окно, чтобы вы могли просто пройти через окно, которое прошло мимо вас.

Второй параметр - это число, которое можно использовать для однозначной идентификации таймера. У вас может быть одновременно запущено более одного таймера, и вам понадобится способ узнать, какой из них сработал.

Третий параметр - это время ожидания таймера перед срабатыванием. Он измеряется в миллисекундах, поэтому вам нужно умножить на тысячу, если вам нужны секунды.

Четвертый параметр равен NULL, если вы хотите обрабатывать таймеры, глядя на WM_TIMER. В противном случае вы можете передать указатель на функцию обратного вызова, которая будет вызываться вместо этого.

Помните, таймер будет срабатывать каждые X миллисекунд, пока вы его не убьете. Вы можете убить его, вызвав KillTimer и передав тот же номер, который вы передали второму параметру при вызове SetTimer.

Кроме того, когда Windows отправляет вам сообщение WM_TIMER, wParam будет содержать идентификатор таймера, который вы передали во втором параметре при вызове SetTimer.

так что вам нужно умножить на тысячу, если вы хотите секунд.

Четвертый параметр равен NULL, если вы хотите обрабатывать таймеры, глядя на WM_TIMER. В противном случае вы можете передать указатель на функцию обратного вызова, которая будет вызываться вместо этого.

Помните, таймер будет срабатывать каждые X миллисекунд, пока вы его не убьете. Вы можете убить его, вызвав KillTimer и передав тот же номер, который вы передали второму параметру при вызове SetTimer.

Кроме того, когда Windows отправляет вам сообщение WM_TIMER, wParam будет содержать идентификатор таймера, который вы передали во втором параметре при вызове SetTimer.

так что вам нужно умножить на тысячу, если вы хотите секунд.

Четвертый параметр - ПУСТО (NULL), если вы хотите обрабатывать таймеры, глядя на WM_TIMER. В противном случае вы можете передать указатель на функцию обратного вызова, которая будет вызываться вместо этого.

Помните, таймер будет срабатывать каждые X миллисекунд, пока вы его не убьете. Вы можете убить его, вызвав KillTimer и передав тот же номер, который вы передали второму параметру при вызове SetTimer.

Кроме того, когда Windows отправляет вам сообщение WM_TIMER, wParam будет содержать идентификатор таймера, который вы передали во втором параметре при вызове SetTimer.

таймер будет продолжать срабатывать каждые X миллисекунд, пока вы его не убьете. Вы можете убить его, вызвав KillTimer и передав тот же номер, который вы передали второму параметру при вызове SetTimer.

Кроме того, когда Windows отправляет вам сообщение WM_TIMER, wParam будет содержать идентификатор таймера, который вы передали во втором параметре при вызове SetTimer.

таймер будет продолжать срабатывать каждые X миллисекунд, пока вы его не убьете. Вы можете убить его, вызвав KillTimer и передав тот же номер, который вы передали второму параметру при вызове SetTimer.

Кроме того, когда Windows отправляет вам сообщение WM_TIMER, wParam будет содержать идентификатор таймера, который вы передали во втором параметре при вызове SetTimer.

0
ответ дан 10 December 2019 в 00:41
поделиться

Возможно, немного не по плану, и это C ++, а не C, но вот моя реализация очереди таймера для Windows с тестами и комментарием к TDD. Обратите внимание, что первая часть серии объясняет, почему я решил использовать свой собственный, а не альтернативные варианты.

http://www.lenholgate.com/blog/2004/05/practical-testing.html

0
ответ дан 10 December 2019 в 00:41
поделиться

Если вы хотите заняться WIN32 пулами потоков , вы можете использовать таймеры пула потоков.

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

Часть этого API, см.

CreateTimerQueueTimer Функция

Создает таймер очереди таймера. Этот таймер истекает в указанное время, а затем через каждый указанный период. По истечении таймера вызывается функция обратного вызова.

0
ответ дан 10 December 2019 в 00:41
поделиться

Из Таймеры и действия по умолчанию :

/* ** TIMEGETC.C - waits for a given number of seconds for the user to press ** a key.     Returns the key pressed, or EOF if time expires ** ** by Bob Jarvis */

#include <stdio.h>
#include <time.h> 
#include <conio.h>

int timed_getch(int n_seconds) 
{
   time_t start, now;

   start = time(NULL); now = start;

   while(difftime(now, start) < (double)n_seconds && !kbhit()) { now = time(NULL); }

   if(kbhit()) 
       return getch(); 
   else 
       return EOF;
}

void main(void)
{
   int c;

   printf("Starting a 5 second delay...\n");

   c = timed_getch(5);

   if(c == EOF)
       printf("Timer expired\n");
   else 
       printf("Key was pressed, c = '%c'\n", c);
}

Но я бы подумал об использовании Window :: SetTimer (), как упоминалось выше ...

1
ответ дан 10 December 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: