![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет. На носу диплом.. в процессе разработки зашла в тупик. у меня есть функция для определения тактовой частоты процессора. Нужно с помощью нее получать конкретные временные зедержки (привязку нужно сделать через системный таймер). Не могу придумать как это реализовать. Частота получается с помощью RdtSC(если нужно взглянуть на функцию, могу выложить исходник). Очень надеюсь на вашу помощь..
|
|
#2
|
|||
|
|||
|
А нужно делать именно так?
А может сделать протой поток с приоритетом, где в цикле крутить sleep(n) и поднятие соотв. события/выброс сообщения? Точность будет вполне приемлемая для обычных задач (не realtime) |
|
#3
|
|||
|
|||
|
нужно именно так. чтобы создать аппаратнонезависимый способ точных замеров. не я придумала тему диплома)
|
|
#4
|
|||
|
|||
|
Чтобы делать временные задержки через системный таймер, скорее всего частоту процессора знать не надо, т.к. обращение к системному таймеру это вызов процедуры операционной системы, а ОС навряд ли будет требовать от вас привязку к железу.
|
|
#5
|
|||
|
|||
|
Просьба немного изменилась.
Вот код. Его надо адаптировать под делфи, а выделенную части надо переделать на получение не просто тика, а на зависимость от частоты процессора (т,е. t = 1/f, f - количество тиков в секунду, частоту получить через rdtsc). Особенность моего задания именно в том, что мне нужно получать временные задержки основываясь именно на частоте процессора. Чем больше частота, тем выше точность задржки. Вот в чем суть! Надесь, что сейчас вопрос более понятен. Код:
#include <windows.h>
#include <iostream>
#include <conio.h>
using namespace std;
class ExactTimer
{
public:
typedef void (*CallbackProc)(void);
ExactTimer()
{
Callback = NULL;
StartThreadHandle = NULL;
RepeatOnce = false;
Milliseconds = 1000;
}
~ExactTimer()
{
Stop();
}
void Start()
{
Stop();
StartThreadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(StartThread),(void*)this,NULL,0);
}
void Stop()
{
if (StartThreadHandle != NULL)
{
TerminateThread(StartThreadHandle, 0);
CloseHandle(StartThreadHandle);
StartThreadHandle = NULL;
}
}
void SetMilliseconds(long milliseconds)
{
Milliseconds = milliseconds;
}
long GetMilliseconds() const
{
return Milliseconds;
}
void SetCallbackProcedure(CallbackProc callback)
{
Callback = callback;
}
void SetRepeatOnce(bool repeatOnce)
{
RepeatOnce = repeatOnce;
}
protected:
CallbackProc Callback;
bool RepeatOnce;
bool Repeat;
long Milliseconds;
HANDLE StartThreadHandle;
static DWORD WINAPI StartThread(void *pExactTimer)
{
ExactTimer exactTimer = *((ExactTimer*)pExactTimer);
LARGE_INTEGER liFrequency, liStartTime, liCurrent;
QueryPerformanceFrequency(&liFrequency);
__int64 llWaitTime = ((liFrequency.QuadPart / 1000) * exactTimer.Milliseconds);
while (true)
{
QueryPerformanceCounter(&liStartTime);
QueryPerformanceCounter(&liCurrent);
while ((liCurrent.QuadPart - liStartTime.QuadPart) < llWaitTime)
QueryPerformanceCounter(&liCurrent);
if (exactTimer.Callback != NULL)
exactTimer.Callback();
if (exactTimer.RepeatOnce)
exactTimer.Stop();
}
return 0;
}
};
void PrintTheEnd()
{
cout << " THE END " << endl;
}
int main()
{
ExactTimer t;
t.SetRepeatOnce(false);
t.SetMilliseconds(100);
t.SetCallbackProcedure(PrintTheEnd);
t.Start();
_getch();
t.Stop();
_getch();
return 0;
} |
|
#6
|
|||
|
|||
|
Цитата:
Ну, собственно, весь интересный код лежит в функции ExactTimer exactTimer, остальное - шелуха вокруг. Собственно, как я понимаю, эта функция запускается как отдельный поток. Фактически,она и выполняет расчет времени ожидания в зависимости от частоты проца. Т.е. тело потока будет выглядеть как-то так: Код:
var
AWaitTime : Int64;
ACurTime, AStartTime : Int64;
CPUFrq : Int64;
begin
QueryPerformanceFrequency(CPUFreq);
AWaitTime := CPUFreq / 1000 * Miliseconds;
QueryPerformanceCounter(AStartTime);
QueryPerformanceCounter(ACurTime);
While Not Terminated Do
Begin
If (ACurTime - AStartTime) > AWaitTime Then
Begin
AStartTime := ACurTime;
If Assigned(FCallBack) Then FCallBack;
End;
QueryPerformanceCounter(ACurTime);
End;
end; |
|
#7
|
|||
|
|||
|
Спасибо! но вопросы еще будут...
![]() |