c++ - 等同于 C++ 的 window.setTimeout()

标签 c++ function execution void-pointers

在 javascript 中有一个非常棒的函数 window.setTimeout( func, 1000 ) ; 它将在 1000 毫秒后异步 调用 func

我想在 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++;
      }
    }

我怎样才能做出这样的作品?

最佳答案

在 C++11 出来后,如果你使用的是支持 c++11 的编译器,你可以使用 lambdavariadic template functionasynchronous thread 轻松模拟c++中的javascript函数。

这是我为 setTimeOut 编写的代码,它已经过全面测试:

setTimeOut函数定义:

    #include <windows.h>//different header file in linux
    #include <future>
    using namespace std;

    template <typename... ParamTypes>
    void setTimeOut(int milliseconds,std::function<void(ParamTypes...)> func,ParamTypes... parames)
    {   
        std::async(std::launch::async,[=]()
        {       
            Sleep(milliseconds);
            func(parames...); 
        });
     };

此函数通过使用 c+11 的可变参数模板接受可变参数, 该代码可以向您展示如何使用它:

    #include <iostream>
    #include <thread>
    #include <string>
    #include <functional>
    #include <windows.h>

    #include <future>
    using namespace std;
    int main() 
    {
        std::mutex locker;
        std::function<void()> func1 = [&]()
        {
            std::unique_lock<std::mutex> lk(locker);
            std::cout << "func 1 is trigged:" << "   no parameter" << std::endl;
            lk.unlock();
        };      
        std::function<void(int)> func2 = [&](int param)
        {
            std::unique_lock<std::mutex> lk(locker);
            std::cout << "func 2 is trigged:" << "   int: " << param <<std::endl;
            lk.unlock();
        };
        std::function<void(int,std::string)> func3 = [&](int param1,std::string param2)
        {
            std::unique_lock<std::mutex> lk(locker);
            std::cout << "func 3 is trigged:" << "   int: " << param1 << ";  string: " << param2 << std::endl;
            lk.unlock();
        };

        for(int index=0;index<100;index++)
        {
            std::unique_lock<std::mutex> lk1(locker);
            std::cout << "set timer for func  1" << std::endl;
            lk1.unlock();
            setTimeOut<>(1000,func1);

            std::unique_lock<std::mutex> lk2(locker);
            std::cout << "set timer for func  2" << std::endl;
            lk2.unlock();
            setTimeOut<int>(2000,func2,10000);

            std::unique_lock<std::mutex> lk3(locker);
            std::cout << "set timer for func  3" << std::endl;
            lk3.unlock();
            setTimeOut<int,std::string>(5000,func3,10000,"ddddd");
        }
        Sleep(10000000);
    }

关于c++ - 等同于 C++ 的 window.setTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2485058/

相关文章:

ruby - 如何制作 Ruby 1.8 小写非拉丁字符?

linux - 执行二进制时是否有任何实用程序来控制线程数量?

Java程序在cmd中执行而不使用设置路径或系统变量

time - CakePHP 2.1 测量页面执行时间

c++ - 使按位函数适用于任何类型的整数输入 C++ 的最佳方法是什么?

excel - Excel中的不同日期格式

javascript - AJAX xmlhttp.send 参数

c++ - 我应该在 C++ 中使用内存地址作为应用程序级标识符吗?

c++ - 从鼠标左键单击 QTableView 获取行和列?

c++ - 如何使用 C++ Win32 API 获取当前系统域 IP 地址?