Перейти к содержимому

Фотография

Timer


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 4

#1
PITSOFT

PITSOFT
  • Гость
  • 40 сообщений
pls, подскажите как создать событие OnTimer в консоли
  • 0

#2
Коляныч

Коляныч
  • В доску свой
  • 2 773 сообщений
кажись простой OnTimer не получится, но можешь заюзать так называемые multimedia timers. Поищи что-нибудь вокруг timeSetEvent
  • 0

#3
vdp

vdp
  • В доску свой
  • 1 268 сообщений
Есть такая функция SetTimer. Так вот она позволяет настроить таймер либо через оконные сообщения, либо через callback функцию (обработчик). Тебе нужно использовать втопрой вариант.
Кстати, компонент TTimer использует эту же функцию.
  • 0

#4
Коляныч

Коляныч
  • В доску свой
  • 2 773 сообщений
на самом деле проблема чуть глубже: в консольном случае нет привычного выгребателя очереди сообщений, поэтому callback функцию некому будет вызвать

#include <windows.h>
#include <stdio.h>

VOID CALLBACK TimerProc(HWND, UINT, UINT_PTR, DWORD dwTime)
{
    printf("what a strange day....");
}

void main()
{
    SetTimer(NULL, 1, 1000, TimerProc);
    getchar();
    KillTimer(NULL, 1);
}

в мультимедиа таймерах всё реализовано по другому: там винда создаёт некий пульсирующий event и высокоприоритетный поток, в котором крутит callback функцию, переходя после каждого вызова в ожидание события. Так что получается полностью всё отвязано от очереди сообщений, поэтому граблей с консолью не возникает. Но требуется иметь в виду, что в этом уже имеем многопоточность со всеми вытекающими требованиями
  • 0

#5
Коляныч

Коляныч
  • В доску свой
  • 2 773 сообщений
хотя в общем-то никто, конечно, не запрещает самому написать выгребалку очереди и тогда SetTimer тоже будет работать.

#include <windows.h>
#include <stdio.h>

int times = 0;

VOID CALLBACK TimerProc(HWND, UINT, UINT_PTR, DWORD dwTime)
{
    printf("tick %d\n", ++times);
}

void main()
{
    SetTimer(NULL, 1, 1000, TimerProc);

    MSG msg;
    while( times < 10 )
    {
        GetMessage( &msg, NULL, 0, 0 );
        DispatchMessage(&msg); 
    }
 
    KillTimer(NULL, 1);
}

  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.