Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Timer в C/C++


Автор: AlexKar 15.2.2006, 23:51
Мне нужно вызывать функцию с интервалом порядка нескольких микросекунд, соответственно SetTimer() использовать бесполезно (минимальный интервал для этой функции порядка нескольких миллисекунд), подскажите пожалуйста чЁ-нибудьsmile, как это можно сделать.

Автор: Daevaorn 16.2.2006, 00:12
AlexKar,
Смотри QueryPerformanceCounter/QueryPerformanceFrequency в msdn

Автор: cardinal 16.2.2006, 00:24
Цитата(AlexKar @ 15.2.2006, 21:51 Найти цитируемый пост)
нужно вызывать функцию с интервалом порядка нескольких микросекунд

А сколько она сама времени длится?

Автор: AlexKar 16.2.2006, 12:10
Она длится порядка 0,1 микросекунды (поиск методом Фибоначчи в маршрутной таблице), а QueryPerformanceCounter/QueryPerformanceFrequency - это как я понял Win32 API функции?

Автор: Dreamer_0x01 16.2.2006, 12:59
ты же этот вопрос поднимал вот десь:
http://forum.vingrad.ru/index.php?showtopic=82663

И там пришли к выводу, что под Windows вроде как не получится.

Автор: Ignat 16.2.2006, 13:31
Цитата(AlexKar @ 15.2.2006, 23:51 Найти цитируемый пост)
Мне нужно вызывать функцию с интервалом порядка нескольких микросекунд,

Тебе таймер, для синхронизации нужен, или просто организовать простои с необязательно равными промежутками?
Если второе, то кажется проблему разрешить на низком уровне.
Т.е. на асме написать цикл NOP'ов, по окончании взывать прерывание. Это должно давать малую паузу, без нагрузки на проц (поправьте ежель не прав). Но это уже обсуждать в разделе асм.
Добавлено @ 13:32
Dreamer_0x01, а по ссылке про железку в слот - мысль

Автор: threef 16.2.2006, 16:26
Стандартный таймер не подойдет. Можешь сделать свой, основанный на тактах процессора. http://forum.vingrad.ru/index.php?showtopic=82663&view=findpost&p=638492

Автор: AlexKar 16.2.2006, 20:34
Я почитал Рихтера, и нашел такой способ:

Код

    LARGE_INTEGER cntbeg, cntend, freq;
   __int64  delaycnt;
   
    

    if (!QueryPerformanceFrequency(&freq))
     //error не поддерживается платформой.
        return 1;

    delaycnt = freq.QuadPart/ROUTFREQ; //ROUTFREQ-частота повторения операции
    
    QueryPerformanceCounter(&cntbeg);

    for(QueryPerformanceCounter(&cntend);
        (cntend.QuadPart - cntbeg.QuadPart) < delaycnt;
        QueryPerformanceCounter(&cntend));   

Этот код дает нужную задержку, единственный trouble, это, когда я его использую в цикле, проц загружается на 100%

Автор: _hunter 17.2.2006, 12:00
выноси код в отдельный поток.
+ а что ты хотел -- выполнять код примерно 1000000 раз в секунду -- это дает определенную нагрузку...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)