Другие языки программирования и технологии
Как на чистом Си реализовать таймер?
Сейчас пишу программку и хочу оптимизировать один кусочек в цикле, который очень часто повторяется. Программа на чистом Си. Хочу посчитать сколько милисекунд исполняется один проход цикла.
TimeCounter timer;
timer.Start();
....
timer.Stop();
std::cout << timer;
код
// TimeCounter.h
#ifndef __TIMECOUNTER222__H__
#define __TIMECOUNTER222__H__
#include <iostream>
// #include <cassert>
//////////////////////////////////////////
/// Допустимые значения приоритета потока:
/// THREAD_PRIORITY_HIGHEST
/// THREAD_PRIORITY_ABOVE_NORMAL
/// THREAD_PRIORITY_NORMAL
/// THREAD_PRIORITY_BELOW_NORMAL
/// THREAD_PRIORITY_LOWEST
//////////////////////////////////////////
class TimeCounter
{
friend std::ostream& operator<<(std::ostream& out, TimeCounter& cntr);
public:
TimeCounter() {started=false; stopped=false;}
void Start();
void Start(int nPriority);
void Stop();
double timeElapsed() const;
bool getStarted() const {return started;}
bool getStopped() const {return stopped;}
int getNewPriority() const {return new_priority;}
~TimeCounter();
protected:
int new_priority;
int old_priority;
bool started;
bool stopped;
double tBefore, tAfter, i64PerfFrequency;
double tWord;
};
#endif
TimeCounter.cpp-------------------------------------------------------------------------------------------
Код:
#include "stdafx.h"
#include "TimeCounter.h"
#include <windows.h>
void TimeCounter::Start()
{
// assert(!started);
started=true;
stopped=false;
new_priority=0;
LARGE_INTEGER pf;
QueryPerformanceFrequency(&pf);
i64PerfFrequency = pf.QuadPart;
Sleep(0);
QueryPerformanceCounter(&pf);
tBefore = pf.QuadPart;
}
void TimeCounter::Start(int nPriority)
{
// assert(!started);
started=true;
stopped=false;
new_priority=nPriority;
old_priority=GetThreadPriority(GetCurrentThread());
SetThreadPriority(GetCurrentThread(),new_priority);
LARGE_INTEGER pf;
QueryPerformanceFrequency(&pf);
i64PerfFrequency = pf.QuadPart;
Sleep(0);
QueryPerformanceCounter(&pf);
tBefore = pf.QuadPart;
}
void TimeCounter::Stop()
{
// assert(started);
LARGE_INTEGER tAfter1;
QueryPerformanceCounter(&tAfter1);
tAfter = tAfter1.QuadPart;
tWord = tAfter - tBefore;
tWord /= i64PerfFrequency;
if (new_priority)
SetThreadPriority(GetCurrentThread(),old_priority);
started=false;
stopped=true;
}
double TimeCounter::timeElapsed() const
{
LARGE_INTEGER tempAfter;
double tempWord;
if (started)
{
QueryPerformanceCounter(&tempAfter);
tempWord = tempAfter.QuadPart - tBefore;
tempWord /= i64PerfFrequency;
return tempWord;
}
if (stopped)
return tWord;
return 0.;
}
TimeCounter::~TimeCounter()
{
if (new_priority)
SetThreadPriority(GetCurrentThread(),old_priority);
}
std::ostream& operator<<(std::ostream& out, TimeCounter& cntr)
{
double fsec = cntr.timeElapsed();
int hour = int(fsec/3600.);
double fmin = fsec-3600.*double(hour);
int min = int(fmin/60.);
double sec = fmin-60.*double(min);
out<<"Time elapsed: "<
timer.Start();
....
timer.Stop();
std::cout << timer;
код
// TimeCounter.h
#ifndef __TIMECOUNTER222__H__
#define __TIMECOUNTER222__H__
#include <iostream>
// #include <cassert>
//////////////////////////////////////////
/// Допустимые значения приоритета потока:
/// THREAD_PRIORITY_HIGHEST
/// THREAD_PRIORITY_ABOVE_NORMAL
/// THREAD_PRIORITY_NORMAL
/// THREAD_PRIORITY_BELOW_NORMAL
/// THREAD_PRIORITY_LOWEST
//////////////////////////////////////////
class TimeCounter
{
friend std::ostream& operator<<(std::ostream& out, TimeCounter& cntr);
public:
TimeCounter() {started=false; stopped=false;}
void Start();
void Start(int nPriority);
void Stop();
double timeElapsed() const;
bool getStarted() const {return started;}
bool getStopped() const {return stopped;}
int getNewPriority() const {return new_priority;}
~TimeCounter();
protected:
int new_priority;
int old_priority;
bool started;
bool stopped;
double tBefore, tAfter, i64PerfFrequency;
double tWord;
};
#endif
TimeCounter.cpp-------------------------------------------------------------------------------------------
Код:
#include "stdafx.h"
#include "TimeCounter.h"
#include <windows.h>
void TimeCounter::Start()
{
// assert(!started);
started=true;
stopped=false;
new_priority=0;
LARGE_INTEGER pf;
QueryPerformanceFrequency(&pf);
i64PerfFrequency = pf.QuadPart;
Sleep(0);
QueryPerformanceCounter(&pf);
tBefore = pf.QuadPart;
}
void TimeCounter::Start(int nPriority)
{
// assert(!started);
started=true;
stopped=false;
new_priority=nPriority;
old_priority=GetThreadPriority(GetCurrentThread());
SetThreadPriority(GetCurrentThread(),new_priority);
LARGE_INTEGER pf;
QueryPerformanceFrequency(&pf);
i64PerfFrequency = pf.QuadPart;
Sleep(0);
QueryPerformanceCounter(&pf);
tBefore = pf.QuadPart;
}
void TimeCounter::Stop()
{
// assert(started);
LARGE_INTEGER tAfter1;
QueryPerformanceCounter(&tAfter1);
tAfter = tAfter1.QuadPart;
tWord = tAfter - tBefore;
tWord /= i64PerfFrequency;
if (new_priority)
SetThreadPriority(GetCurrentThread(),old_priority);
started=false;
stopped=true;
}
double TimeCounter::timeElapsed() const
{
LARGE_INTEGER tempAfter;
double tempWord;
if (started)
{
QueryPerformanceCounter(&tempAfter);
tempWord = tempAfter.QuadPart - tBefore;
tempWord /= i64PerfFrequency;
return tempWord;
}
if (stopped)
return tWord;
return 0.;
}
TimeCounter::~TimeCounter()
{
if (new_priority)
SetThreadPriority(GetCurrentThread(),old_priority);
}
std::ostream& operator<<(std::ostream& out, TimeCounter& cntr)
{
double fsec = cntr.timeElapsed();
int hour = int(fsec/3600.);
double fmin = fsec-3600.*double(hour);
int min = int(fmin/60.);
double sec = fmin-60.*double(min);
out<<"Time elapsed: "<
Без WinAPI функций тебе не обойтись, т. к. таймер уже системная фигны.
Ну или ты можешь делать цикл, типа
while()
{
Sleep();
}
Но это такой псевдо таймер.
Ну или ты можешь делать цикл, типа
while()
{
Sleep();
}
Но это такой псевдо таймер.
Похожие вопросы
- Как реализовать таймер в TPascal'e
- Стоит ли писать на чистом Си (со стандартом C11)? Чем чистый Си лучше может быть C++? И тот, и другой знаю поверхностно.
- Что сейчас из себя представляет чистый Си? Что пишут на Си? Если пишут, то почему не на С++?
- Что значит программировать на чистом Си, Бейсике, Паскаль и т. д.?
- Помогите пожалуйста создать программу "Таймер" на СИ. Заранее всем благодарен!)
- можно ли в Winapi создать несколько таймеров, если программа работает без окна?
- Программирование,Сделать программу - таймер. Задаётся задержка срабатывания в минутах и секундах.
- Как обнулить таймер на чужом сайте через код элемента?
- Разница между Си и Си++
- Как из си++ сделать си?)... подробнее