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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
26.01.2011, 19:19     Таймер в миллисекундах, который не укладывает программу спать #1
Столкнулся с проблемой: нужно каждые 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)
}
тоже вроде не то. чтобы такого использовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2011, 19:19     Таймер в миллисекундах, который не укладывает программу спать
Посмотрите здесь:

Как сделать на С++ программу который водишь любую букву она показывает тебе сколько болших и маленьких букв C++
Как определить время чтения данных из файла в миллисекундах? C++
помогите дописать программу таймер с релизацией классов C++
C++ помогите дописать программу таймер с релизацией классов
Выводит системную дату в файл в миллисекундах, не смотря на работу фунцкии localtime C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,289
Завершенные тесты: 1
26.01.2011, 20:27     Таймер в миллисекундах, который не укладывает программу спать #2
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
26.01.2011, 21:33     Таймер в миллисекундах, который не укладывает программу спать #3
Можно создать отдельный поток с таймером.
Цитата Сообщение от alexcoder Посмотреть сообщение
И что? Такой таймер будет посылать WM_TIMER в очередь сообщений, а чтобы ловить сообщения, надо GetMessage.
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ом, там нашел примеры использования, ушел читать)
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,289
Завершенные тесты: 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);
}
ser4ega
27 / 27 / 3
Регистрация: 15.11.2009
Сообщений: 143
26.01.2011, 22:00  [ТС]     Таймер в миллисекундах, который не укладывает программу спать #6
alexcoder, эмм.. у тебя в 6ой строке айди после мессаджа идет?
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,289
Завершенные тесты: 1
26.01.2011, 22:13     Таймер в миллисекундах, который не укладывает программу спать #7
ну да, только все равно они не используются, но прототип все равно должен быть в таком виде. Когда винда вызывает эту функцию, она передает параметры в стеке именно в таком порядке.
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. 
        // 
 
}
alexcoder
1438 / 652 / 86
Регистрация: 03.06.2009
Сообщений: 3,289
Завершенные тесты: 1
26.01.2011, 22:39     Таймер в миллисекундах, который не укладывает программу спать #9
ну и что, а IDT_MOUSETRAP определен где-то в программе.
ID полностью пользовательское значение.

(TIMERPROC) NULL - в этом случае в оконную функцию окна hwnd при срабатывании таймера будет послано сообщение WM_TIMER. То есть таймер имеет два режима работы: через оконную функцию, и через процедуру таймера.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2011, 23:09     Таймер в миллисекундах, который не укладывает программу спать
Еще ссылки по теме:

Создайте программу с классом student, который включает в себя данные о студентах, желающих получить места в общежитии. C++
C++ Написать программу на языке С + + которая реализует конструктор который инициализирует исходные данные класса
C++ Таймер который запускается по новой через каждые полчаса

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

Или воспользуйтесь поиском по форуму:
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
там все очень подробно и на русском языке.
Всем спасибо. Тему можно считать закрытой.
Yandex
Объявления
26.01.2011, 23:09     Таймер в миллисекундах, который не укладывает программу спать
Ответ Создать тему
Опции темы

Текущее время: 04:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru