В 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++; } }
Как я могу заставить что-то вроде этого работать?
Сделайте Callback :: func
типа void (*) ()
, т.е.
struct Callback
{
double execTime;
void (*func)();
};
Вы можете вызвать функцию следующим образом:
c1.func();
Кроме того, не заняты -ждать. Используйте ualarm
в Linux или CreateWaitableTimer
в Windows.
В C ++ вы сами по себе довольно ограничены. Вам нужна либо многопоточная ОС, в которой вы могли бы использовать функцию сна (вы все равно можете продолжить работу программы с отдельным потоком), либо вам нужна система обмена сообщениями, такая как Windows.
Я вижу, что единственный другой способ сделать что-то - это разбросать множество вызовов по всему коду, который вызывает функцию, возвращающую истину или ложь, в зависимости от того, истекло ли время. Функция, конечно, может быть обратным вызовом, но вам все равно придется периодически ее вызывать.
Я здесь только исправляю ваш код, а не мыслию нестандартно. Другие ответы уже дали некоторые указания на это.
Для большей безопасности типов вы должны объявить свой указатель обратного вызова следующим образом:
// The function to execute after execTime has passed
void (*func)() ;
Затем назовите его как:
c1.func() ;