2011-05-06 23 views
6

インタビューの質問にお手伝いしますか?タイマーを使用することができるように、機能Sleep(int seconds)を考えるとインタビュー質問インターフェイスの実装

は、次のインタフェースを実装しています。彼女の目的は彼女の目的は、すべてのタイマー を開始するという、タイマー

  • 機能void StartTimers()を作成することです

    • 機能void CreateTimer(void (*func)(), int seconds)

    開始されたすべてのタイマーは、数秒間遅延してからコールバックを使用して関数を呼び出す必要があります。 例:

    CreateTimer(func1,3); 
    CreateTimer(func2,7); 
    CreateTimer(func3,10); 
    StartTimers() 
    

    folowingが起きなければならない:3秒間

    遅延をした後、次に4秒間機能1. 遅延を呼び出し、次に関数の呼び出し2 遅延を3秒と関数3を呼び出してください。

    どのようにこのようなインターフェイスを実装するのですか?

  • +0

    これはあなたのインタビューで面接の質問であるならば、あなたはそれを自分で答えるべきではありませんか? –

    +9

    私のインタビューではありませんでした。このサイトでは、人々がここで質問して特別な問題は見られないというインタビューの質問がたくさんあります – Yakov

    +1

    タイマーはすべて同時に起動しますか、前者の場合、コールバックが実行するには時間がかかりません。それ以外の場合、遅延はオフになります。 –

    答えて

    3

    編集1:質問APIを使用します。

    EDIT 2:おっと、q.pop()を呼び出しませんでした。

    これはstd::priority_queueのジョブのように聞こえますが、期限までに注文します。

    //pseudo-code 
    class Job; 
    std::priority_queue<Job, std::vector<Job>, CompareLessByDeadline> q; 
    
    CreateTimer(func, deadline) { 
        q.push(Job(func, deadline)); 
    } 
    StartTimers() { 
        now = 0; 
        while(!q.empty()) { 
        Job& j = q.top(); 
        Sleep(j.deadline-now); 
        now = j.deadline; 
        j.function(); 
        q.pop(); 
        } 
    } 
    
    1

    擬似コードは>

    1. のようなものがタイプ
    2. では、タイマー機能を作成し、開始タイマー機能で辞書
    3. に2つのパラメータを追加し続ける、それぞれを呼び出すのグローバル辞書を作成することができ辞書のそれぞれの値をスリープした後の関数の数
    +0

    ここには辞書は必要ありません。順序付けされたリスト/配列/ベクトルが行います。 – hammar

    +0

    あなたは各機能に対する時間を記録する必要があります。したがって、単一次元配列/リストは機能しません。あなたは2つの次元が必要です。 – neebz

    +0

    私はもちろん、遅れと組み合わされた関数のリストを意味していました。私はちょうどあなたがそれらを入れて同じ順序で戻ってほしいので、辞書を必要としないと言っています。 – hammar

    1
    //globals vector v1; vector v2; 
    
    CreateTimer(func, delay) { 
    v1.push_back(func); 
    v2.push_back(delay); } 
    
    
    StartTimers() { startDelay=0; 
    for(i=0; i<v2.size; i++) { 
        sleep(v2[i]-startDelay); 
        *v1[i] //call the function 
        startDelay=v2[i]; } 
    
    }