Возникли проблемы с вызовом функции. C ++ - PullRequest
0 голосов
/ 21 января 2020

Я написал функцию SetInterval и SetTimeOut как функцию Javascript, но я не могу установить низкое значение 100 миллисекунд, а также я не могу вызвать два SetInterval. Пожалуйста, помогите мне!

Включая

#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std::chrono;
using namespace std;

milliseconds ms = duration_cast<milliseconds>(
    system_clock::now().time_since_epoch()
    );

SetTimeOut с функцией параметров

 template <typename Proc, typename T>
    void SetTimeOut(T & val, Proc p, unsigned long long n) {
        unsigned long long def = ms.count(); // starting point
        unsigned long long ds = ms.count() + n; // the time what need become equal to def

        while (def != ds) {
            milliseconds ms = duration_cast<milliseconds>(
                system_clock::now().time_since_epoch()
                ); // time updates
            def = ms.count(); // converting to nums

        }
        p(val); // calling the main function
    }

То же самое, но вызывая функцию непараметра

template <typename Proc>
void SetTimeOut(Proc p, unsigned long long n) {
    unsigned long long def = ms.count() ;
    unsigned long long ds = ms.count() + n;
    while (def != ds) {
        milliseconds ms = duration_cast<milliseconds>(
            system_clock::now().time_since_epoch()
            ); // time updates
        def = ms.count();
    }
    p(); // Main function calling
}

p - функция, которую мы хотим вызвать, n - сколько времени должно пройти, s - сколько раз должно повторяться. SetInterval с функцией unparametr

template <typename Proc>
void SetInterval(Proc p, unsigned long long n, long long s) {
    //here there are call in turn of function SetTimeOut
    for (int i = 1; i != s + 1; i++) SetTimeOut(p, n * i);
}
//Same, but for parametr function
template <typename T, typename Proc>
void SetInterval(T val, Proc p, unsigned long long n, long long s) { 
    for(int i = 1; i != s+1; i++) SetTimeOut(val, p, n * i);

}
 //Example with struct
  struct Car{
    string model;
    double speed;
    int fuel;
};

Основная функция

int main() {
    Car Car;
    int i = 1;
    Car.fuel = 200;
    Car.speed = 10.2;

    //Example with lambda function.
    SetInterval(Car,[&](struct Car){
        Car.speed += 1.9;
        Car.fuel -= 1.2;
        cout << Car.speed << " " << Car.fuel << endl;
        }, 900, 10); // it will end after 10 calls with 0.9 sec interval
     //Second Example, wich not working
    SetInterval(i, [&](int i){ i++; cout << i << endl;}, 500, 5);
}

Я думаю, потому что время вызова пересекается, но я не знаю, как это исправить.

1 Ответ

0 голосов
/ 21 января 2020

Не делайте этого:

    while (def != ds) {
        milliseconds ms = duration_cast<milliseconds>(
            system_clock::now().time_since_epoch()
            ); // time updates
        def = ms.count(); // converting to nums

    }
    p(val); // calling the main function

Это вращение l oop. Он будет просто привязывать все ядро ​​ЦП, постоянно проверяя, «пришло ли время». По крайней мере, поместите туда оператор сна и проверьте <= вместо != на случай, если ваши часы опередят вас.

    while (def <= ds) {

        duration<milliseconds> tosleepfor(ds-def);
        this_thread::sleep_for(tosleepfor);

        milliseconds ms = duration_cast<milliseconds>(
            system_clock::now().time_since_epoch()
            ); // time updates
        def = ms.count(); // converting to nums

    }
    p(val); // calling the main function

Но вот фундаментальная проблема с вашим дизайном. Javascript имеет встроенный насос сообщений для выполнения асинхронной работы, включая настройку таймеров с обратными вызовами. C ++ не имеет такой возможности. Ваша функция SetTimeout на самом деле не устанавливает время ожидания. Он просто останавливает программу до тех пор, пока не будет достигнуто время.

Вы должны использовать поток GUI вашей операционной системы или иметь собственную концепцию перекачки сообщений для отправки обратных вызовов через определенные интервалы c.

...