Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
#1

Таймер в миллисекундах, который не укладывает программу спать - C++

26.01.2011, 19:19. Просмотров 2036. Ответов 9
Метки нет (Все метки)

Столкнулся с проблемой: нужно каждые n миллисекунд вызывать функцию, но так, чтобы программа не "засыпала" .
Sleep() - не подходит
Timer() вроде тоже
C++
1
2
3
4
5
6
GetSystemTime(&time1);
while(true)
{
GetSystemTime(&time2);
if (time2-time1==n) {....} //ну или там (time1.wMilliseconds-time2.wMilliseconds==n)
}
тоже вроде не то. чтобы такого использовать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2011, 19:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Таймер в миллисекундах, который не укладывает программу спать (C++):

Таймер который запускается по новой через каждые полчаса - C++
Здравствуйте нужно сделать таймер который работает бесконечно и и через каждые полчаса запускался по новой с номиналом пол часа

Таймер который отсчитывает количество пройденного времени. - C#
Здравствуйте есть ли у кого из вас код: таймер который отсчитывает количество пройденного времени. Допустим запущена прога, а внизу...

Консольный таймер, который по истечении времени выключает компьютер - C (СИ)
нужно сделать консольный таймер который по истечению некоторого времени (1 минута) выключает компьютер ОС WinXP так же чтобы был...

Таймер, который выводит количество секунд с момента запуска программы - C (СИ)
Друзья, возможно ли реализовать таймер в С (не С++)? Я накидал вот такую простую прогу с помощью ncurses, которая выводит кол-во...

Не получается стартовать таймер, который бы изменял значение content в label - C# WPF
Не получается стартовать таймер, который бы изменял значение content в label. Без таймера - оно изменяется, с - нет. Пробовал и Threading и...

как при нажатии на кнопку формы1 запустить таймер который на форме2? - C++ Builder
Здравствуйте, уважаемые! Такой вопросик у меня: Прогу пишу в С++билдер, есть две форма, на первой кнопа при нажатии на которую...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alexcoder
1464 / 678 / 89
Регистрация: 03.06.2009
Сообщений: 3,566
Завершенные тесты: 1
26.01.2011, 20:27 #2
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
1
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
26.01.2011, 21:33 #3
Можно создать отдельный поток с таймером.
Цитата Сообщение от alexcoder Посмотреть сообщение
И что? Такой таймер будет посылать WM_TIMER в очередь сообщений, а чтобы ловить сообщения, надо GetMessage.
1
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
26.01.2011, 21:48  [ТС] #4
alexcoder,
Мой английский из нот гут энаф, но, как я понял, нужно подключать только windows.h, а она в свою очередь включает в себя нужный таймеру user.h
И еще первый параметр - хендл консоли, третий - время
А вот второй и последний
Второй что-то про сбрасывание счетчика, если у окна уже есть таймер, и все равно неясно, как его использовать
А четвертый - указатель на функцию, которая будет вызвана по истечению времени таймера?
Очень пожалуйста увидеть пример использования
Ну и спасибо, что ответили =D
alexcoder,

Добавлено через 3 минуты
Somebody, А что еще можно использовать?
И как поймать мессэдж гет мессэджем??

Добавлено через 4 минуты
alexcoder,
научился пользоваться MSDNом, там нашел примеры использования, ушел читать)
0
alexcoder
1464 / 678 / 89
Регистрация: 03.06.2009
Сообщений: 3,566
Завершенные тесты: 1
26.01.2011, 21:52 #5
Первый параметр - хэндл окна, может быть 0, если нет окна
второй - ID события
третий - время срабатывания
четвертый - адрес функции
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SetTimer(NULL,1000,100,(TIMERPROC)TimerProc);
 
...
 
VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
if(flag)
    {
    BitBlt(hdc,pt.x,pt.y,80,80,bufdc,0,0,SRCCOPY);
    }
GetCursorPos(&pt);
BitBlt(bufdc,0,0,80,80,hdc,pt.x,pt.y,SRCCOPY);
flag=1;
colob(hdc,pt.x,pt.y);
}
0
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
26.01.2011, 22:00  [ТС] #6
alexcoder, эмм.. у тебя в 6ой строке айди после мессаджа идет?
0
alexcoder
1464 / 678 / 89
Регистрация: 03.06.2009
Сообщений: 3,566
Завершенные тесты: 1
26.01.2011, 22:13 #7
ну да, только все равно они не используются, но прототип все равно должен быть в таком виде. Когда винда вызывает эту функцию, она передает параметры в стеке именно в таком порядке.
1
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
26.01.2011, 22:37  [ТС] #8
alexcoder, здесь ID написан не цифрами (IDT_MOUSETRAP)
C++
1
2
3
4
5
6
7
8
9
10
11
12
// Set the timer for the mousetrap. 
UINT uResult;               // SetTimer's return value 
uResult = SetTimer(hwnd,             // handle to main window 
    IDT_MOUSETRAP,                   // timer identifier 
    10000,                           // 10-second interval 
    (TIMERPROC) NULL);               // no timer callback 
 
if (uResult == 0) //что означает это условие? В uResult хранится текущее значение таймера?
//оно равно 0 когда время истекает, или наоборот, когда таймер только поставили?
{ 
    ErrorHandler("No timer is available."); 
}
Добавлено через 1 минуту
и для чего нужен этот таймер, если он не уведомляет никакую функцию? ((TIMERPROC) NULL)

Добавлено через 1 минуту
вот так выглядит весь код, взято с http://msdn.microsoft.com/en-us/libr...creating_timer
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
HICON hIcon1;               // icon handle 
POINT ptOld;                // previous cursor location 
UINT uResult;               // SetTimer's return value 
HINSTANCE hinstance;        // handle to current instance 
 
//
// Perform application initialization here. 
//
 
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); 
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); 
 
// Record the initial cursor position. 
 
GetCursorPos(&ptOld); 
 
// Set the timer for the mousetrap. 
 
uResult = SetTimer(hwnd,             // handle to main window 
    IDT_MOUSETRAP,                   // timer identifier 
    10000,                           // 10-second interval 
    (TIMERPROC) NULL);               // no timer callback 
 
if (uResult == 0) 
{ 
    ErrorHandler("No timer is available."); 
} 
 
LONG APIENTRY MainWndProc( 
    HWND hwnd,          // handle to main window 
    UINT message,       // type of message 
    WPARAM  wParam,     // additional information 
    LPARAM  lParam)     // additional information 
{ 
 
    HDC hdc;        // handle to device context 
    POINT pt;       // current cursor location 
    RECT rc;        // location of minimized window 
 
    switch (message) 
    { 
        //
        // Process other messages. 
        // 
 
        case WM_TIMER: 
        // If the window is minimized, compare the current 
        // cursor position with the one from 10 seconds 
        // earlier. If the cursor position has not changed, 
        // move the cursor to the icon. 
 
            if (IsIconic(hwnd)) 
            { 
                GetCursorPos(&pt); 
 
                if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) 
                { 
                    GetWindowRect(hwnd, &rc); 
                    SetCursorPos(rc.left, rc.top); 
                } 
                else 
                { 
                    ptOld.x = pt.x; 
                    ptOld.y = pt.y; 
                } 
            } 
 
            return 0; 
 
        case WM_DESTROY: 
 
        // Destroy the timer. 
 
            KillTimer(hwnd, IDT_MOUSETRAP); 
            PostQuitMessage(0); 
            break; 
 
        //
        // Process other messages. 
        // 
 
}
0
alexcoder
1464 / 678 / 89
Регистрация: 03.06.2009
Сообщений: 3,566
Завершенные тесты: 1
26.01.2011, 22:39 #9
ну и что, а IDT_MOUSETRAP определен где-то в программе.
ID полностью пользовательское значение.

(TIMERPROC) NULL - в этом случае в оконную функцию окна hwnd при срабатывании таймера будет послано сообщение WM_TIMER. То есть таймер имеет два режима работы: через оконную функцию, и через процедуру таймера.
1
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
26.01.2011, 23:09  [ТС] #10
alexcoder, в этой проге - mousetrap, пока таймер не истек switch(message) не начнется?
то есть тайер работает как слип и кладет программу спать, не позволяя выполняться другим функциям, или он все же работает независимо от других, и по истеченю нужного времени всех притормозит и отошлет сообщение?, заставив код выполняться с другого места?
Как это работает?

Добавлено через 1 минуту
alexcoder, можешь привести пример работы таймера убрав все лишнее, чтобы можно было над ним поэксперементировать?

Добавлено через 23 минуты
Если вдруг кому-то понадобится, есть в нете статья http://www.helloworld.ru/texts/comp/...alc/vc2/10.htm
там все очень подробно и на русском языке.
Всем спасибо. Тему можно считать закрытой.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2011, 23:09
Привет! Вот еще темы с ответами:

Таймер на Jquery, который после истечения времени начинал бы заново отсчитывать - jQuery
Добрый день! Не могу найти таймер на Jquery, который после истечения времени начинал бы заново отсчитывать. Например, отсчитывает 24 часа,...

.NET 4.x Нужен таймер, который будет вести обратный отсчёт, начиная с 10 мин - C#
Здравствуйте! Нужен таймер который будет вести обратный отсчёт, начиная с 10 мин, и запускатся при нажатии на кнопку.

Как создать таймер, который будет показывать время работы программы - Java SE
как создать таймер который будет показывать время работы программы надо что бы до тысячных секунды, спасибо за помощь заранее.

Необходимо создать таймер, который раз в секунду менять изображение в pictureBox1 - C#
Здравствуйте! Необходимо создать таймер, который раз в секунду менять изображение в PictureBox1. И сначала(повторить). Например: сек 1:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.01.2011, 23:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru