1

Тема: Секундомір на мові Сі

Доброго дня. Я початківець в програмуванні зараз намагаюся створити програму яка включає в себе секундомір, але через те що Си мова однопоточна я не можу реализувати зупинку (або вихід) по натиску клавіші. Можливо хтось знає як мені вийти із ситуації? Ось текст фрагменту

#include "stdafx.h"
#include "windows.h"

inline void mydelay(int milliseconds) //Затримка
{
  Sleep(milliseconds);
}

int _tmain(int argc, _TCHAR* argv[])
{
int h=0, m=0, s=0;

        for(s=0; s<=60; s++)
        {
            if (s==60)
            {
                s=0;
                m++;
                if (m==60)
                {
                    m=0;
                    h++;
                        if(h==24)
                            break;
                }
            }           
        mydelay(1000);           
        system("cls");
        printf("Timer\n%d:%d:%d", h, m, s);
                }
system("pausa");
    return 0;
}

2

Re: Секундомір на мові Сі

KilJaeden написав:

Доброго дня. Я початківець в програмуванні зараз намагаюся створити програму яка включає в себе секундомір, але через те що Си мова однопоточна я не можу реализувати зупинку (або вихід) по натиску клавіші. Можливо хтось знає як мені вийти із ситуації? Ось текст фрагменту

#include "stdafx.h"
#include "windows.h"

inline void mydelay(int milliseconds) //Затримка
{
  Sleep(milliseconds);
}

int _tmain(int argc, _TCHAR* argv[])
{
int h=0, m=0, s=0;

        for(s=0; s<=60; s++)
        {
            if (s==60)
            {
                s=0;
                m++;
                if (m==60)
                {
                    m=0;
                    h++;
                        if(h==24)
                            break;
                }
            }           
        mydelay(1000);           
        system("cls");
        printf("Timer\n%d:%d:%d", h, m, s);
                }
system("pausa");
    return 0;
}

system("pause");
Подякували: 0xDADA11C7, KilJaeden2

3 Востаннє редагувалося koala (19.12.2017 19:23:00)

Re: Секундомір на мові Сі

C - НЕ однопоточна мова. С не підтримує багатопотоковість на рівні мовних конструкцій, це правда, але вам ніхто не забороняє використовувати багатопоточні бібліотеки.
Багатопоточність тут взагалі не потрібна. В однозадачних системах якось же робили обробку клавіш, правда? Ну так от, вам потрібно зчитувати дані безпосередньо з буфера клавіатури. Стандартні засоби C на це неспроможні, бо розраховані на абстрактний пристрій введення (з телетайпом ніколи не працювали?); але ж ви користуєтеся windows.h - значить, можна взяти щось там. Почніть з GetKeyState.

Ну і крім того, ваша програма не працює як секундомір, оскільки чекає щонайменше секунду (так, Sleep гарантує паузу у МІНІМУМ вказаний період часу, а може бути і довшим), а крім того, ще й викликає купу системних функцій (system запускає cmd.exe, який значно складніший за цю вашу програму), що теж не дуже швидко. За хвилину на пару секунд точно відстанете. Робіть паузу на півсекунди, запитуйте поточний час і виводіть його (чи обчислену різницю поточного часу і часу запуску).

Подякували: 0xDADA11C7, varkon, KilJaeden, LoganRoss, leofun015

4

Re: Секундомір на мові Сі

/KIT\ написав:
system("pause");

А може, йому так зручно?

Подякували: KilJaeden1

5

Re: Секундомір на мові Сі

KilJaeden написав:

... через те що Си мова однопоточна

Некоректне твердження.
Читайте про багатоплатформну лібу pthread та WinAPI хвункцію CreateThread

KilJaeden написав:

я не можу реализувати зупинку (або вихід) по натиску клавіші.

Вам багатопоточність для цього і не потрібна.

Подякували: KilJaeden, leofun012

6

Re: Секундомір на мові Сі

http://www.cplusplus.com/reference/ctime/time/ , перевіряти кожні 10 мілісекунд

Подякували: KilJaeden, М18х002

7

Re: Секундомір на мові Сі

Всім дякую за допомогу! Тепер я здається зрозумів в якому напрямку мені потрібно працювати.