2011-05-06 17 views
6

Potrebbe aiutarmi con la seguente domanda di intervista.Implementazione dell'interfaccia domanda intervista

funzione Sleep(int seconds) Dato implementare seguente interfaccia in modo timer potrebbero essere utilizzati:

  • funzione void CreateTimer(void (*func)(), int seconds) che il suo scopo è quello di creare il timer
  • funzione void StartTimers() che il suo scopo per avviare tutti i timer

Ogni timer avviato deve essere ritardato di alcuni secondi e quindi utilizzare una richiamata per chiamare una funzione. Esempio:

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

folowing dovrebbe accadere:

Ritardo per 3 secondi e quindi chiamare per la funzione 1. di ritardo per 4 secondi e quindi chiamare per la funzione 2. Ritardo per 3 secondi e poi chiamare la funzione 3.

La domanda è come implementare tale interfaccia?

+0

Se si tratta di una questione intervista nella tua intervista, non dovresti essere rispondendo da soli? –

+9

Non era nella mia intervista. Ci sono molte domande di intervista in questo sito che le persone chiedono qui, quindi non vedo alcun problema speciale – Yakov

+1

I timer iniziano tutti allo stesso tempo o si eseguono uno dopo l'altro? Se il primo, può funzionare solo se i callback richiedono tempi di esecuzione trascurabili. Altrimenti i ritardi saranno spenti. –

risposta

3

MODIFICA 1: utilizzare l'API delle domande.

EDIT 2: Oops, non ha chiamato q.pop();

Questo suona come un lavoro per std::priority_queue, ordinato per scadenza.

//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

Il codice pseudo potrebbe essere qualcosa di simile>

  1. creare un dizionario globale di tipo
  2. Nel creare funzione timer, continuare ad aggiungere i due parametri nel dizionario
  3. In funzione di timer di avvio, chiamare ogni delle funzioni dopo una sospensione del rispettivo valore nel dizionario
+0

Non hai davvero bisogno di un dizionario qui. Qualsiasi lista/matrice/vettore ordinato farà. – hammar

+0

dovrai tenere traccia del tempo rispetto a ciascuna funzione. quindi un array/elenco di dimensioni singole non funzionerà. Hai bisogno di due dimensioni. – neebz

+0

Intendevo una lista di funzioni accoppiate a ritardi, ovviamente. Sto solo dicendo che dal momento che li vuoi tornare nello stesso ordine in cui li hai inseriti, non c'è bisogno di un dizionario. – 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]; } 

}