Форум программистов, компьютерный форум CyberForum.ru

Как добиться 40 миллисекунд в консоле? - C++

Восстановить пароль Регистрация
 
fair7
8 / 8 / 0
Регистрация: 31.12.2010
Сообщений: 81
08.06.2014, 19:21     Как добиться 40 миллисекунд в консоле? #1
Функция Sleep() не пойдёт


Написал такой код, но он даст 26 кадров в секунду вместо 25.
C++
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
#include <stdio.h>  // D7R printf
#include <conio.h>  // D7R _getch
#include<sys\timeb.h>
timeb tms;
short ms15()
{
    ftime(&tms);
    return  tms.millitm;
}
#define L 123
short tim[L];
int main()
{
    char one=1,compared;
    short ti,tb=0;    
    for(int c=L;c;)
    {        
        ++ti=ms15();
 
        if((ti-tb)>compared||(ti-tb)<0)
        {
            if(one%2)compared=44;
            else compared=29;
            tim[--c]=ti-tb;
            tb=ti;
            ++one;
        }
    }
    tb=0;printf("\n");
    for(int c=L-1;c;)
    {
        printf("\n   tim=%d",tim[c-1]);
        if(tim[c-1]>0)
        {   tb+=tim[--c];
            printf("\tif(tim[c]<0) tb=%d",tb);
        }
        else
        {tb+=1000+tim[--c];
            printf("\t1000+tim[--c]   ==   %d",1000+tim[c]);
        }
    }
    printf("\n\ntb=%d",tb);
    float fb=(float)tb/(L-1);
    printf("\n\n%f",fb);
    printf("\n\n 4ACTOTA KADPOB == %f",1000/fb);
    
    getch();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
08.06.2014, 19:23     Как добиться 40 миллисекунд в консоле? #2
В общем случае никак
Винда не система реального времени
но можно попробовать использовать мультимедийные таймеры
но это непереносимо
VTsaregorodtsev
297 / 277 / 35
Регистрация: 19.02.2010
Сообщений: 1,210
08.06.2014, 21:19     Как добиться 40 миллисекунд в консоле? #3
fair7, не извращайтесь с консолью - а сразу переходите к технологиям работы с видео. Под виндой - это Video for Windows (старая, тормозная и мало умеющая) и DirectShow, а может и ещё что-то (давно уже не занимался системным программированием именно в этой области - не знаю новинок Семёрки-Восьмёрки).
В общем, у видеоплейеров же нет такой проблемы? Более того - они нормально стыкуют непрерывно идущий звук с дискретно идущими кадрами
fair7
8 / 8 / 0
Регистрация: 31.12.2010
Сообщений: 81
12.06.2014, 23:27  [ТС]     Как добиться 40 миллисекунд в консоле? #4
Мне хочется пока с консолью поиграться.
Вот моё решение:
C++
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
#include <stdio.h>  // D7R printf
#include <conio.h>  // D7R _getch
#include<sys\timeb.h>
timeb times;
short ms15()// 15,625
{
    ftime(&times);
    return  times.millitm;
}
long stopwatch()//stopwatch - CEKyHDOMEP
{
    ftime(&times);
    return  times.time;
}
#define L 123
short tim[L];
int main()
{
    long secbuf=stopwatch();
    short ti,tb=0;
    char images=0,interval_time=45,pass=2;
    for(int c=L;c;)
    {
        ti=ms15();
        if((ti-tb)>interval_time||(ti-tb)<0)
        {
            if(images<24)
            {
                if(images%pass)interval_time=45;
                else interval_time=30;
 
                tim[--c]=ti-tb;
                tb=ti;
                ++images;
                switch(images){case 16:pass=4;}
            }
            else if(secbuf-stopwatch())
            {
                secbuf=stopwatch();
                ti=ms15();
                tim[--c]=ti-tb;// printf("\n_ %i",tim[c]);// D7R nPOBEPKU
                tb=ti;
                images=0;
                pass=2;
            }
        }
    }
    tb=0;printf("\n");
    for(int c=L-1;c;)
    {
        printf("\n   tim=%d",tim[c-1]);
        if(tim[c-1]>0)
        {   tb+=tim[--c];
            printf("\t tb=%d",tb);
        }
        else
        {   tb+=1000+tim[--c];
            printf("\t1000+tim[c]== %d",1000+tim[c]);
        }
    }
    printf("\n\n      O5SEE BPEMR == %d",tb);
    float fb=(float)tb/(L-1);
    printf("\n\n CPEDHEE 3HA4EHUE == %f",fb);
    printf("\n\n   4ACTOTA KADPOB == %f",1000/fb);
 
    getch();
    return 0;
}
Yandex
Объявления
12.06.2014, 23:27     Как добиться 40 миллисекунд в консоле?
Ответ Создать тему
Опции темы

Текущее время: 20:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru