9

javascriptには、1000ミリ秒後に非同期で呼び出さwindow.setTimeout( func, 1000 ) ;れるこの甘くて甘い関数があります。func

C ++で(マルチスレッドなしで)同様のことをしたいので、次のようなサンプルループをまとめました。

    #include <stdio.h>

    structコールバック
    {{
      //この関数は_time_実行されます。
      double execTime;

      //execTimeが経過した後に実行する関数
      void * func;
    };

    //実行するサンプル関数
    void go()
    {{
      puts( "GO");
    }

    //グローバルなプログラム全体の時間感覚
    ダブルタイム ;

    int main()
    {{
      //タイマーを開始します
      時間=0;

      //サンプルのコールバックを作成します
      コールバックc1;
      c1.execTime = 10000;
      c1.func = go;

      while(1)
      {{
        //それを実行する時間
        if(時間> c1.execTime)
        {{
          c1.func; // !! 動作しません!
        }

        時間++;
      }
    }

どうすればこのような作品を作ることができますか?

4

5 に答える 5

12

C ++ 11がリリースされた後、c ++ 11でサポートされているコンパイラを使用している場合は、ラムダ可変個引数テンプレート関数非同期スレッドを使用して、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);
    }
于 2013-12-06T22:58:11.767 に答える
5

タイプCallback::funcのメーカーvoid (*)()、すなわち

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

この関数は次のように呼び出すことができます。

c1.func();

また、忙しくしないでください-待ってください。ualarmLinuxまたはCreateWaitableTimerWindowsで使用します。

于 2010-03-20T22:57:19.297 に答える
1

C ++自体では、かなり制限されています。スリープ機能を使用できるマルチスレッドOS(プログラムを別のスレッドで実行し続けることができます)、またはWindowsなどのメッセージングシステムが必要です。

あなたが何かをすることができると私が思う他の唯一の方法は、時間が経過したかどうかに応じて、trueまたはfalseを返す関数を呼び出すコード全体に多数の呼び出しを分散させることです。もちろん、この関数はコールバックにすることもできますが、それでも定期的に呼び出す必要があります。

于 2010-03-20T22:53:58.367 に答える
1

私はここであなたのコードを修正しているだけで、箱の外では考えていません。他の答えはすでにそのためのいくつかの指針を与えました。

型の安全性を高めるために、コールバックポインタを次のように宣言する必要があります。

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

次に、それを次のように呼び出します。

  c1.func() ;
于 2010-03-20T23:00:05.407 に答える
0

もう1つの(より良い)答えは<functional>、C ++でヘッダーを使用し、次のように関数を宣言することです。

#include <functional>

function<void ()> func ;

// assign like
func = go ; //go is a function name that accepts 0 parameters
// and has return type void

// exec like
func() ;
于 2011-12-14T15:57:27.830 に答える