Эквивалентный window.setTimeout () для C++

В JavaScript существует эта сладкая, сладкая функция window.setTimeout( func, 1000 ) ; который асинхронно вызовет func после 1 000 мс.

Я хочу сделать что-то подобное в C++ (без многопоточности), таким образом, я соединил демонстрационный цикл как:

    #include <stdio.h>

    struct Callback
    {
      // The _time_ this function will be executed.
      double execTime ;

      // The function to execute after execTime has passed
      void* func ;
    } ;

    // Sample function to execute
    void go()
    {
      puts( "GO" ) ;
    }

    // Global program-wide sense of time
    double time ;

    int main()
    {
      // start the timer
      time = 0 ;

      // Make a sample callback
      Callback c1 ;
      c1.execTime = 10000 ;
      c1.func = go ;

      while( 1 )
      {
        // its time to execute it
        if( time > c1.execTime )
        {
          c1.func ; // !! doesn't work!
        }

        time++;
      }
    }

Как я могу заставить что-то вроде этого работать?

7
задан bobobobo 20 March 2010 в 22:44
поделиться

3 ответа

Сделайте Callback :: func типа void (*) () , т.е.

struct Callback
{
    double execTime;
    void (*func)();
};

Вы можете вызвать функцию следующим образом:

c1.func();

Кроме того, не заняты -ждать. Используйте ualarm в Linux или CreateWaitableTimer в Windows.

5
ответ дан 6 December 2019 в 15:20
поделиться

В C ++ вы сами по себе довольно ограничены. Вам нужна либо многопоточная ОС, в которой вы могли бы использовать функцию сна (вы все равно можете продолжить работу программы с отдельным потоком), либо вам нужна система обмена сообщениями, такая как Windows.

Я вижу, что единственный другой способ сделать что-то - это разбросать множество вызовов по всему коду, который вызывает функцию, возвращающую истину или ложь, в зависимости от того, истекло ли время. Функция, конечно, может быть обратным вызовом, но вам все равно придется периодически ее вызывать.

1
ответ дан 6 December 2019 в 15:20
поделиться

Я здесь только исправляю ваш код, а не мыслию нестандартно. Другие ответы уже дали некоторые указания на это.

Для большей безопасности типов вы должны объявить свой указатель обратного вызова следующим образом:

  // The function to execute after execTime has passed
  void (*func)() ;

Затем назовите его как:

  c1.func() ;
1
ответ дан 6 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: