powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог GetTickCount под Linux.
6 сообщений из 6, страница 1 из 1
Аналог GetTickCount под Linux.
    #34500021
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен аналог Виндовского GetTickCount - т.е. функция, которая возвращает
количество "тиков", прошедших с момнта старта системы, например. Желательна
точность не менее 1/250 секунды.Чем это можно сделать? По поиску в гугле
выкинуло на предложение использовать times() в комбинации с
sysconf(_SC_CLK_TCK), но оно явно делает не то что мне нужно - вместо
времени, прошедшего внутри системы, возвращает время, прошедшее внутри
процесса. Плюс sysconf(_SC_CLK_TCK) возвращает у меня точность 100, что
есть мало.

Ниже тестовая программа под opengl/glut (под обе платформы), для которой это
надо.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
#ifdef WIN32
#include <windows.h>
#else
#include <sys/times.h>
#include <unistd.h>
#endif

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <math.h>

#ifdef WIN32
DWORD ticksPerSecond(void){
        return  1000 ;
#else
clock_t ticksPerSecond(void){
        return sysconf(_SC_CLK_TCK);
#endif
}

#ifndef WIN32
clock_t GetTickCount(void){
        tms tm;
        return times(&tm);
}
#endif

void init(void){
        glClearColor( 0 ,  0 ,  0 ,  0 );
        glShadeModel (GL_FLAT);
}

void display(void){     
        glClear(GL_COLOR_BUFFER_BIT);
        glPushMatrix();
        glLoadIdentity();

        GLfloat time =
(GLfloat)GetTickCount()/(GLfloat)ticksPerSecond(); /*ключевой момнт,
которые меня интересует*/

        GLfloat spin = time *  90 .0f;
        spin = fmod (spin,  360 .0f);  
        glRotatef(spin,  0 .0f,  0 .0f,  1 .0f);
        glColor3f( 1 .0f,  1 .0f,  1 .0f);
        glRectf(- 25 .0f, - 25 .0f,  25 .0f,  25 .0f);
        glPopMatrix();
        glutSwapBuffers();
}

void reshape(int w, int h){
        glViewport( 0 ,  0 , (GLsizei)w, (GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(- 50 . 0 ,  50 . 0 , - 50 . 0 ,  50 . 0 , - 1 . 0 ,  1 . 0 );
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

void idle(void){
        glutPostRedisplay();
}

int main(int argc, char **argv){
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
        glutInitWindowSize( 250 ,  250 );
        glutInitWindowPosition( 100 ,  100 );
        glutCreateWindow(argv[ 0 ]);
        init();
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutIdleFunc(idle);
        glutMainLoop();
        return  0 ;
}
программа должна отображать квадрат, вращающийся со скоростью 90 градусов в
секунду. Под mingw/wine получается "правильный" вариант, который вертитьс с
одинаковой скоростью вне зависимости от загрузки системы и выделения
процессорного времени. Под линуксом скорость вращения неверная, и она
снижается/повышается в зависимости от загрузки процессора. Т.е. это не то,
что нужно. в man 7 time упоминается software clock, который меня и
интресует, но ссылок на функции я чего-то не увидел. Может, я чего-то
недопонял или недостаточно глубоко копнул? Подскажите, пожалуйста, решение.

ЗЫ. gettimeofday, как я понял из исходников wine, дает точность 1/100
секунды. Это маловато. Есть ещё варианты?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Аналог GetTickCount под Linux.
    #34500607
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ErV

ЗЫ. gettimeofday, как я понял из исходников wine, дает точность 1/100
секунды. Это маловато. Есть ещё варианты?
Posted via ActualForum NNTP Server 1.4
GetTickCount возвращает не тики а миллесекунды. Его точность около 15мс.
А вообще clock http://www.cppreference.com/stddate/clock.html
...
Рейтинг: 0 / 0
Аналог GetTickCount под Linux.
    #34500686
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daevaorn wrote:

> GetTickCount возвращает не тики а миллесекунды. Его точность около 15мс.
> А вообще clock http://www.cppreference.com/stddate/clock.html
Спасибо. Странно все это, но хоть обьясняет, почему иногда между двумя
вызовами GetTickCount(), проходило 0 миллисекунд.

К слову. В процессе ковыряния обнаружил очень интересную вещь:
Код программы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <sys/times.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>

int main(int argc, char** argv){
    while (true){
        tms tm;
        clock_t time = times(&tm);
        long res = sysconf(_SC_CLK_TCK);
        float f = (float)time/(float)res;
        printf("%f, %f\n", f, (float)time/(float)res);
    }
    return  0 ;
}

А вот вывод, который она выдает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
17190298.000000, 17190298.940000
17190298.000000, 17190298.950000
17190298.000000, 17190298.950000
17190298.000000, 17190298.950000
17190298.000000, 17190298.960000
17190298.000000, 17190298.960000
17190298.000000, 17190298.970000
17190298.000000, 17190298.970000
17190298.000000, 17190298.970000
17190298.000000, 17190298.980000
17190298.000000, 17190298.980000
17190298.000000, 17190298.990000
17190298.000000, 17190298.990000
17190298.000000, 17190298.990000
17190300.000000, 17190299.000000
17190300.000000, 17190299.000000
17190300.000000, 17190299.010000
17190300.000000, 17190299.010000
17190300.000000, 17190299.010000
17190300.000000, 17190299.020000
17190300.000000, 17190299.020000
17190300.000000, 17190299.030000
Это как понимать? Глюк? Такого ведь быть, по идее, не должно. (компилятор
g++ 3.4.6)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Аналог GetTickCount под Linux.
    #34501171
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
daevaorn wrote:

> GetTickCount возвращает не тики а миллесекунды. Его точность около 15мс.
> А вообще clock http://www.cppreference.com/stddate/clock.html
Спасибо. Странно все это, но хоть обьясняет, почему иногда между двумя
вызовами GetTickCount(), проходило 0 миллисекунд.

К слову. В процессе ковыряния обнаружил очень интересную вещь:
Код программы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <sys/times.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>

int main(int argc, char** argv){
    while (true){
        tms tm;
        clock_t time = times(&tm);
        long res = sysconf(_SC_CLK_TCK);
=>        double f = (float)time/(float)res;
        printf("%f, %f\n", f, (float)time/(float)res);
    }
    return  0 ;
}

А вот вывод, который она выдает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
17190298.000000, 17190298.940000
17190298.000000, 17190298.950000
17190298.000000, 17190298.950000
17190298.000000, 17190298.950000
17190298.000000, 17190298.960000
17190298.000000, 17190298.960000
17190298.000000, 17190298.970000
17190298.000000, 17190298.970000
17190298.000000, 17190298.970000
17190298.000000, 17190298.980000
17190298.000000, 17190298.980000
17190298.000000, 17190298.990000
17190298.000000, 17190298.990000
17190298.000000, 17190298.990000
17190300.000000, 17190299.000000
17190300.000000, 17190299.000000
17190300.000000, 17190299.010000
17190300.000000, 17190299.010000
17190300.000000, 17190299.010000
17190300.000000, 17190299.020000
17190300.000000, 17190299.020000
17190300.000000, 17190299.030000
Это как понимать? Глюк? Такого ведь быть, по идее, не должно. (компилятор
g++ 3.4.6)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Аналог GetTickCount под Linux.
    #34501174
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <sys/times.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>

int main(int argc, char** argv){
    while (true){
        tms tm;
        clock_t time = times(&tm);
        long res = sysconf(_SC_CLK_TCK);
        double f = (float)time/(float)res;
        printf("%f, %f\n", f, (float)time/(float)res);
    }
    return  0 ;
}

От так.
...
Рейтинг: 0 / 0
Аналог GetTickCount под Linux.
    #34501597
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> От так.

Спасибо, вчера вечером сам дошел, отписать забыл. Всегда почему-то думал что
результат деления двух флоатов будет тоже флоат, а не дабл :-\
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог GetTickCount под Linux.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]