Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Таймер, выходи из цикла при нажатии клавиши


Автор: JAYBE 18.1.2013, 14:37
Добрый день.
Узнал про ctime и решил попробовать что-то сделать.
Нужно релизовать вывод секунд и при нажатии клавиши, остановить цикл вывода.
Я сделал так:
Код

#include <iostream>
#include <ctime>
using namespace std;
int main()
{
    int i = 1;
    int clock1;
    int z = 0;
    while (i>0) {
        clock1 = clock()/1000000;
        if (z!=clock1) {
            cout << clock1 << endl;
            z+=1;
        }
        i++;
    }
}


Куда нужно вставлять cin.get(), чтобы при нажатии произошёл выход из цикла?

Автор: feodorv 18.1.2013, 16:33
Цитата(JAYBE @  18.1.2013,  15:37 Найти цитируемый пост)
clock()/1000000;

Если мне не изменяет память, делить надо на CLOCKS_PER_SEC. Вообще, приведённый цикл будет бесцельно поедать процессорное время, не говоря уже о том, что в начале будут выведены не секунды, а просто значение счётчика z:
Цитата(JAYBE @  18.1.2013,  15:37 Найти цитируемый пост)

           z+=1;
           z = clock1;


Цитата(JAYBE @  18.1.2013,  15:37 Найти цитируемый пост)
Куда нужно вставлять cin.get(), чтобы при нажатии произошёл выход из цикла? 

Никуда. Здесь cin.get() не обойдёшься. Нужна просто проверка, что клавиша нажата: kbhit() smile 

Автор: dershokus 18.1.2013, 16:59
Может быть так?

Код

int main()
{
    int ch=0;
    while(true)
    {
        ch=getch();
        if(ch=='X') return(0);
        printf("clock: %l",clock());
    }
}

Автор: JAYBE 21.1.2013, 13:37
dershokus, а какие библиотеки надо подключить? А то не все выполняется...

Автор: bsa 21.1.2013, 13:46
JAYBE, в гугл вбей название функции, которую не находит компилятор

Автор: JAYBE 23.1.2013, 11:51
Не работает... Может из-за того что Убунта стоит и Qt?

Такой код тоже не работает:
Код

#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
    int ch=0;
     while(!kbhit());
    {
        //ch=getchar();
        //if(ch=='X') return(0);
        cout << clock() << endl;
           //printf("clock: %l",clock());
    }
}

"Ругается" на #include <conio.h>

Автор: bsa 23.1.2013, 12:08
JAYBE, конечно ругается. Потому что conio.h имеется только для винды.
Чтобы решить эту проблему попробуй использовать такую конструкцию:
Код
char ch;
while(!cin.readsome(&ch, 1) && cin.good())
{
   sleep(1); //ждать 1 сек.
   cout << clock() << endl;
}

Автор: JAYBE 23.1.2013, 13:45
sleep не исполняется

Нашёл! man 3 sleep
Код

#include <iostream>
#include <stdio.h>
#include <ctime>
#include <unistd.h>
using namespace std;
int main()
{
char ch;
while(!cin.readsome(&ch, 1) && cin.good())
{
    cout << clock() << endl;
    sleep(1);
}
}

Каждую секунду мне выводится <0>. Не совсем то, что ожидал от кода

Автор: feodorv 23.1.2013, 14:39
Цитата(JAYBE @  23.1.2013,  14:45 Найти цитируемый пост)
Каждую секунду мне выводится <0>

А если так:
Код

cout << (double) clock() << endl;
?

Автор: JAYBE 25.1.2013, 12:26
Цитата(feodorv @ 23.1.2013,  14:39)
Цитата(JAYBE @  23.1.2013,  14:45 Найти цитируемый пост)
Каждую секунду мне выводится <0>

А если так:
Код

cout << (double) clock() << endl;
?

Без имзенений:

0
0
0
0
0
0
0

Автор: bsa 25.1.2013, 13:29
 smile 
clock() возвращает сколько программа заняла у процессора времени.

JAYBE, используй лучше time(NULL);

Автор: JAYBE 25.1.2013, 14:59
Спасибо =)
А как теперь секунды достать?

P.S. После JS и PHP сложновато такие банальные вещи сделать...

Автор: bsa 25.1.2013, 15:57
почитай документацию на localtime

Автор: JAYBE 28.1.2013, 15:33
Решил сделать таймер по другому...
Код

#include <iostream>
#include <stdio.h>
#include <unistd.h>
using namespace std;
int main() {
    int z = 0;
    char ch;
    while(!cin.readsome(&ch, 1) && cin.good()) {
        sleep(1);
        cout << z++ << endl;
    }
}

Только во на нажатие клавиши он не останавливается...

Автор: bsa 28.1.2013, 16:05
JAYBE, жми на enter

Автор: JAYBE 29.1.2013, 09:18
Цитата(bsa @ 28.1.2013,  16:05)
JAYBE, жми на enter

Безрезультатно

Автор: bsa 29.1.2013, 14:11
Эх... Ладно, остался только один не очень чистый "хак": добавь в начало программы std::ios::sync_with_stdio(false);

Автор: XLAT 30.1.2013, 05:03
Код

// mytime - время в миллисекудах
float mytime = timeGetTime();


интересно, а в никсах есть поддержка timeGetTime()?

вот так я делаю выход по нажатию заданной клавиши:
Код

    while(1)
    {
            ...

            cout << блаблабла;

        if (getchar() == 'q') break;
    }


Автор: feodorv 30.1.2013, 09:20
Цитата(XLAT @  30.1.2013,  06:03 Найти цитируемый пост)
интересно, а в никсах есть поддержка timeGetTime()?

XLAT, в никсах http://omnicode.net/qa.jsp?id=91 http://linux.die.net/man/2/clock_gettime smile 

Цитата(XLAT @  30.1.2013,  06:03 Найти цитируемый пост)
вот так я делаю выход по нажатию заданной клавиши:

А разве программа при этом не зависает на getchar, ожидая нажатия клавиши?

Автор: JAYBE 30.1.2013, 09:33
Цитата(bsa @ 29.1.2013,  14:11)
Эх... Ладно, остался только один не очень чистый "хак": добавь в начало программы std::ios::sync_with_stdio(false);

Да, теперь работает. Вот такой код:
Код

#include <iostream>
#include <stdio.h>
#include <unistd.h>
using namespace std;
int main() {
    std::ios::sync_with_stdio(false);
    int z = 0;
    char ch;
    while(!cin.readsome(&ch, 1) && cin.good()) {
        sleep(1);
        cout << z++ << endl;
    }
}

Можешь вкратце сказать что выполняет этот метод?

Автор: bsa 30.1.2013, 11:06
JAYBE, документацию открой и прочитай.

Автор: XLAT 30.1.2013, 19:46
Цитата(feodorv @  30.1.2013,  09:20 Найти цитируемый пост)
А разве программа при этом не зависает на getchar, ожидая нажатия клавиши?


 smile 

пардон за оффтоп

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)