Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/89: Рейтинг темы: голосов - 89, средняя оценка - 4.55
MaD1

Как сделать таймер в Visual C++ (Win32 Application, без форм)?

07.09.2010, 17:45. Показов 17370. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! В Visual C++ 6 создаю проект Win32 Application, не
подразумевающий наличии форм. Нужно выполнять несколько действий
в несколько потоков, нужно сделать несколько таймеров.
Как создать таймер, использующий SetTimer() и WM_TIMER? (Sleep() не предлагать)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2010, 17:45
Ответы с готовыми решениями:

Как писать по-русски в Visual C++ (win32 console application)
Подскажите, пожалуйста, как сделать, чтобы вместо каракуль были русские символы в VC++ (win32 console application)?

Не создается новый проект win32 console application Visual в C++ 2010 Professional
Проблема в следующем. С какого-то момента Visual C++ 2010 Professional перестал создавать новые проекты. Происходит следующее:...

После установки Visual Studio 2013(community), не создаются win32 console application.
после установки visual studio 2013(community) не создаются win32 console application. подскажите, что можно сделать.

10
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
08.09.2010, 16:48
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
    UINT_PTR SetTimer(
    HWND hWnd,              // handle to window
    UINT_PTR nIDEvent,      // timer identifier
    UINT uElapse,           // time-out value
    TIMERPROC lpTimerFunc)  
    
    hWnd - окошко которое создали CreateWindow(...)
    nIDEvent - номер таймера
    uElapse - интервал в милесек.
    lpTimerFunc - установим в NULL
 
    WM_TIMER:
 
    в WndProc(...)
 
    case WM_TIMER:
    {
            switch (wParam) //wParam - номер таймера (nIDEvent)
            {
                case 1:
                    ....    
                    break;
                case 2:
                    ....
                    break;
                    
                ....
            
            }       
      
        }
        
    break;
Если что надо поподробние то могу пояснить.
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
08.09.2010, 19:07
Вам должны подойти функции CreateWaitableTimer/SetWaitableTimer

Можно попробовать и SetTimer, только немного не так как советует Kovalsky2.
Первый параметр - NULL (HWND)
Второй параметр - 0
Третий - нужный интервал времени
Четвертый - указатель на функцию, которая будет вызвана через указанный промежуток.
0
MaD1
08.09.2010, 21:05
Kovalsky2, в моем проекте нет форм, поэтому твой способ отпадает
(а создавать форму только для таймера я не хочу).

Bazile, на функции CreateWaitableTimer/SetWaitableTimer VC ругается,
мол: 'undeclared identifier', в какой dll они находятся?
И еще: с функцией SetTimer() я не понял, разъясни, я делаю так:
C++
1
2
3
4
5
6
void Mess(){
MessageBox(0,'','',0);
}
void *p = (TIMERPROC) &Mess;
 
SetTimer(NULL, 0, 1000, (TIMERPROC)&p);
Не пашет. КАК???
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
08.09.2010, 23:36
to MaD1:
Понял.
Тогда, у Вас все в принципи правильно только одна опечаточка:
Вместо:
C++
1
SetTimer(NULL, 0, 1000, (TIMERPROC)&p);
Надо:
C++
1
SetTimer(NULL, 0, 1000, (TIMERPROC)p);
И если это не заработает,то надо искать где то в другом месте.
0
86 / 62 / 69
Регистрация: 15.03.2007
Сообщений: 6,903
09.09.2010, 12:48
> на функции CreateWaitableTimer/SetWaitableTimer VC ругается,
> мол: 'undeclared identifier', в какой dll они находятся?
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib

Т.к. эта функция доступна начиная с Win98 перед включением windows.h надо определить один из макросов
Code
1
2
#define _WIN32_WINNT    0x0400
#define _WIN32_WINDOWS  0x0410
0
MaD1
09.09.2010, 20:17
смасибо
MaD1
09.09.2010, 20:33
Bazile, сделал все как ты говорил:
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
#include 'stdafx.h' //windows.h там
#define _WIN32_WINNT 0x0400 //У меня 2000
#include <Winbase.h>
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    LPSECURITY_ATTRIBUTES s;
    CreateWaitableTimer(&s, false, 'Time');
    return 0;
}
 
Все равно undeclared identifier!
//-----------------------------------------
НАсчет SetTimer:
#include 'stdafx.h'
void Mess(){
MessageBox(0, 'yo', '', 0);
}
void *p = (TIMERPROC) &Mess;
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    SetTimer(NULL, 0, 1000, (TIMERPROC)p);
    return 0;
}
Вроде ошибок нет, но функция не выполняется, и вообще программа сразу
выходит, тогда сделал так:
C++
1
2
3
4
...
SetTimer(NULL, 0, 1000, (TIMERPROC)p);
Sleep(INFINITE); //Чтобы типа не вгружалась прога
...
Не работает! Если не влом, сделайте на Visual C++ (6 если можно)
и скиньте на mad_factor@mail.ru
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
10.09.2010, 15:06
2 MaD1
//SetTimer
Необходим ещё главный цикл программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
MSG msg;
while (true)
{
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
        if (msg.message==WM_QUIT)break;//Условие выхода из цикла
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }else
    {   //Для нас нет никаких месаг и можно заниматься своими делами
        //Втом числе можно установить и своё условие выхода из цикла
    }
}
...
Поставте его в WinMain(...) перед return 0

Данный цикл обрабатывает всякие win месаги для
нашей проги.Втом чисте и таймеры.
Выход из этого цикла равносилен выходу из программы.
Для выхода из проги где нибуть в своей проги
можите воспользоватьмя PostQuitMessage(0);
На пример:
C++
1
2
3
4
5
6
void Mess()
{
    statuc int exit=0;  
    if (exit==3)PostQuitMessage(0);else exit++;
    MessageBox(0,'yo','',0);    
}
У Вас выскочит 3 MessageBox,затем приложение закроеться.
0
MaD1
11.09.2010, 18:18
Большое спасибо
MaD1
11.09.2010, 18:23
Все. Наконец-то разобрался!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2010, 18:23
Помогаю со студенческими работами здесь

Вывод текста любым цветом в Microsoft Visual Studio 2005 (Win32 Console application)
подскажите пожалуйста существует ли способ выводить текст любым цветом в Microsoft Visual Studio 2005 (Win32 Console application)

Как сделать таймер без формы?
Как сделать таймер без формы? То есть чтобы он был в program.cs


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru