реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Работа со временными отрезками в си
Buratino
сообщение Sep 5 2013, 06:26
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



Какие способы существуют для задания определённых промежутков времени с помощью си?
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Sep 5 2013, 06:45
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



http://www.cplusplus.com/reference/ctime/

Но вообще вопрос непростой. Функции для работы с временем обычно достаточно сильно завязаны на используемую ось. Если это линукс, то там есть clock_gettime и usleep. Если это windows, то QueryPerformanceFrequency и Sleep. Если оси нет вообще, то можно использовать просто временные задержки или портировать функции из time.h - для этого нужно написать свою реализацию функций __time32 и/или __time64.
Go to the top of the page
 
+Quote Post
Buratino
сообщение Sep 5 2013, 07:13
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



Цитата
Но вообще вопрос непростой. Функции для работы с временем обычно достаточно сильно завязаны на используемую ось. Если это линукс, то там есть clock_gettime и usleep. Если это windows, то QueryPerformanceFrequency и Sleep. Если оси нет вообще, то можно использовать просто временные задержки или портировать функции из time.h - для этого нужно написать свою реализацию функций __time32 и/или __time64.


Использую Win32 Console, Sleep() как таковой не подходит по причине того, что нужно постоянно использовать поток, а вот QueryPerformanceFrequency - это интересно
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Sep 5 2013, 07:51
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Вот реализация posix совместимого gettime.c для винды. Не знаю, правда, как у этого кода с совместимостью со старыми виндами...

CODE
#include "gettime.h"

#ifdef __cplusplus
extern "C" {
#endif

static LARGE_INTEGER getFILETIMEoffset()
{
SYSTEMTIME s;
FILETIME f;
LARGE_INTEGER t;

s.wYear = 1970;
s.wMonth = 1;
s.wDay = 1;
s.wHour = 0;
s.wMinute = 0;
s.wSecond = 0;
s.wMilliseconds = 0;
SystemTimeToFileTime(&s, &f);
t.QuadPart = f.dwHighDateTime;
t.QuadPart <<= 32;
t.QuadPart |= f.dwLowDateTime;
return (t);
}

int clock_gettime(clockid_t clk_id, struct timespec *tp)
{
LARGE_INTEGER t;
FILETIME f;
double microseconds;
static LARGE_INTEGER offset;
static double frequencyToMicroseconds;
static int initialized = 0;
static BOOL usePerformanceCounter = 0;

(void)clk_id;

if (!initialized) {
LARGE_INTEGER performanceFrequency;
initialized = 1;
usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
if (usePerformanceCounter) {
QueryPerformanceCounter(&offset);
frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
} else {
offset = getFILETIMEoffset();
frequencyToMicroseconds = 10.;
}
}
if (usePerformanceCounter) QueryPerformanceCounter(&t);
else {
GetSystemTimeAsFileTime(&f);
t.QuadPart = f.dwHighDateTime;
t.QuadPart <<= 32;
t.QuadPart |= f.dwLowDateTime;
}

t.QuadPart -= offset.QuadPart;
microseconds = (double)t.QuadPart / frequencyToMicroseconds;
t.QuadPart = (LONGLONG)microseconds;
tp->tv_sec = (long)(t.QuadPart / 1000000);
tp->tv_nsec = (t.QuadPart % 1000000) * 1000;
return (0);
}

#ifdef __cplusplus
}
#endif
Go to the top of the page
 
+Quote Post
Buratino
сообщение Sep 5 2013, 08:48
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



Цитата(andrewlekar @ Sep 5 2013, 10:51) *
Вот реализация posix совместимого gettime.c для винды. Не знаю, правда, как у этого кода с совместимостью со старыми виндами...

CODE
#include "gettime.h"

#ifdef __cplusplus
extern "C" {
#endif

static LARGE_INTEGER getFILETIMEoffset()
{
SYSTEMTIME s;
FILETIME f;
LARGE_INTEGER t;

s.wYear = 1970;
s.wMonth = 1;
s.wDay = 1;
s.wHour = 0;
s.wMinute = 0;
s.wSecond = 0;
s.wMilliseconds = 0;
SystemTimeToFileTime(&s, &f);
t.QuadPart = f.dwHighDateTime;
t.QuadPart <<= 32;
t.QuadPart |= f.dwLowDateTime;
return (t);
}

int clock_gettime(clockid_t clk_id, struct timespec *tp)
{
LARGE_INTEGER t;
FILETIME f;
double microseconds;
static LARGE_INTEGER offset;
static double frequencyToMicroseconds;
static int initialized = 0;
static BOOL usePerformanceCounter = 0;

(void)clk_id;

if (!initialized) {
LARGE_INTEGER performanceFrequency;
initialized = 1;
usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
if (usePerformanceCounter) {
QueryPerformanceCounter(&offset);
frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
} else {
offset = getFILETIMEoffset();
frequencyToMicroseconds = 10.;
}
}
if (usePerformanceCounter) QueryPerformanceCounter(&t);
else {
GetSystemTimeAsFileTime(&f);
t.QuadPart = f.dwHighDateTime;
t.QuadPart <<= 32;
t.QuadPart |= f.dwLowDateTime;
}

t.QuadPart -= offset.QuadPart;
microseconds = (double)t.QuadPart / frequencyToMicroseconds;
t.QuadPart = (LONGLONG)microseconds;
tp->tv_sec = (long)(t.QuadPart / 1000000);
tp->tv_nsec = (t.QuadPart % 1000000) * 1000;
return (0);
}

#ifdef __cplusplus
}
#endif


Кодище!!
Вы скинули хорошую ссылку, нашёл вроде то, что нужно, по крайней мере что-то получилось слепить на первых порах, буду смотреть дальше
Go to the top of the page
 
+Quote Post
lbm
сообщение Sep 20 2013, 08:54
Сообщение #6





Группа: Участник
Сообщений: 12
Регистрация: 13-01-11
Пользователь №: 62 213



Цитата(Buratino @ Sep 5 2013, 10:26) *
Какие способы существуют для задания определённых промежутков времени с помощью си?


Попробуйте посмотреть в MSDN раздел
Waitable Timer Objects

Функции:
CreateWaitableTimer
SetWaitableTimer
...

Эти средства позволяют отмерять промежутки времени с точностью до ms
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 23 2013, 09:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(lbm @ Sep 20 2013, 12:54) *
Эти средства позволяют отмерять промежутки времени с точностью до ms
Уточнение - позволяют задавать промежутки времени с точностью до 1 ms. А вот отрабатывать они их будут с той точностью, какая получится. В общем случае не лучше точности системных часов (десятки ms)
Однако, часами можно управлять - см тут
Go to the top of the page
 
+Quote Post
Buratino
сообщение Oct 1 2013, 08:11
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 24-11-11
Из: Город-герой Минск
Пользователь №: 68 491



Решил вопрос с помощью компонента Timer в С++ Builder, самый простейший вариант, точность порядка десятков мс, но она хромает, причём нормально sm.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016